Android之网络通信案例分析

时间:2021-07-15 06:09:56

由于一个项目的需要,我研究了一下android的网络通信方式,大体和java平台的很相似!
Android之网络通信案例分析 
android平台也提供了很多的api供开发者使用,请按示例图:
Android之网络通信案例分析 
首先,介绍一下通过http包工具进行通信,分get和post两种方式,两者的区别是:
1,post请求发送数据到服务器端,而且数据放在html header中一起发送到服务器url,数据对用户不可见,get请求是把参数值加到url的队列中,这在一定程度上,体现出post的安全性要比get高
2,get传送的数据量小,一般不能大于2kb,post传送的数据量大,一般默认为不受限制。
访问网络要加入权限 <uses-permission android:name="android.permission.internet" />
下面是get请求httpget时的示例代码:

复制代码 代码如下:


view code
// 创建defaulthttpclient对象
httpclient httpclient = new defaulthttpclient();
// 创建一个httpget对象
httpget get = new httpget(
"http://192.168.1.88:8888/foo/secret.jsp");
try
{
// 发送get请求
httpresponse httpresponse = httpclient.execute(get);
httpentity entity = httpresponse.getentity();
if (entity != null)
{
// 读取服务器响应
bufferedreader br = new bufferedreader(
new inputstreamreader(entity.getcontent()));
string line = null;
response.settext("");
while ((line = br.readline()) != null)
{
// 使用response文本框显示服务器响应
response.append(line + "\n");
}
}
}
catch (exception e)
{
e.printstacktrace();
}
}


post请求httppost的示例代码:

复制代码 代码如下:


view code
httpclient httpclient=new defaulthttpclient();
httppost post = new httppost(
"http://192.168.1.88:8888/foo/login.jsp");
// 如果传递参数个数比较多的话可以对传递的参数进行封装
list<namevaluepair> params = new arraylist<namevaluepair>();
params.add(new basicnamevaluepair("name", name));
params.add(new basicnamevaluepair("pass", pass));
try
{
// 设置请求参数
post.setentity(new urlencodedformentity(
params, http.utf_8));
// 发送post请求
httpresponse response = httpclient
.execute(post);
// 如果服务器成功地返回响应
if (response.getstatusline()
.getstatuscode() == 200)
{
string msg = entityutils
.tostring(response.getentity());
// 提示登录成功
toast.maketext(httpclienttest.this,
msg, 5000).show();
}
}
catch (exception e)
{
e.printstacktrace();
}
}


其次,介绍一下,使用java包的工具进行通信,也分get和post方式
默认使用get方式,示例代码:

复制代码 代码如下:


view code
try
{
string urlname = url + "?" + params;
url realurl = new url(urlname);
// 打开和url之间的连接或者httpurlconnection
urlconnection conn =realurl.openconnection();
// 设置通用的请求属性
conn.setrequestproperty("accept", "*/*");
conn.setrequestproperty("connection", "keep-alive");
conn.setrequestproperty("user-agent",
"mozilla/4.0 (compatible; msie 6.0; windows nt 5.1; sv1)");
// 建立实际的连接
conn.connect();
// 获取所有响应头字段
map<string, list<string>> map = conn.getheaderfields();
// 遍历所有的响应头字段
for (string key : map.keyset())
{
system.out.println(key + "--->" + map.get(key));
}
// 定义bufferedreader输入流来读取url的响应
in = new bufferedreader(
new inputstreamreader(conn.getinputstream()));
string line;
while ((line = in.readline()) != null)
{
result += "\n" + line;
}
}
catch (exception e)
{
system.out.println("发送get请求出现异常!" + e);
e.printstacktrace();
}
// 使用finally块来关闭输入流


使用post的示例代码:

复制代码 代码如下:


view code
try
{
url realurl = new url(url);
// 打开和url之间的连接
urlconnection conn = realurl.openconnection();
// 设置通用的请求属性
conn.setrequestproperty("accept", "*/*");
conn.setrequestproperty("connection", "keep-alive");
conn.setrequestproperty("user-agent",
"mozilla/4.0 (compatible; msie 6.0; windows nt 5.1; sv1)");
// 发送post请求必须设置如下两行
conn.setdooutput(true);
conn.setdoinput(true);
// 获取urlconnection对象对应的输出流
out = new printwriter(conn.getoutputstream());
// 发送请求参数
out.print(params);
// flush输出流的缓冲
out.flush();
// 定义bufferedreader输入流来读取url的响应
in = new bufferedreader(
new inputstreamreader(conn.getinputstream()));
string line;
while ((line = in.readline()) != null)
{
result += "\n" + line;
}
}
catch (exception e)
{
system.out.println("发送post请求出现异常!" + e);
e.printstacktrace();
}


从以上知,get请求只需要conn.connect(),post请求时,必须设置 conn.setdooutput(true),conn.setdoinput(true),还必须获取urlconnection的输出流getoutputstream()
最后,使用套接字(soket)进行通信分为两种形式:面向连接的(tcp)和无连接的(udp 数据报)
tcp连接示例:

复制代码 代码如下:


view code
//服务器端
//创建一个serversocket,用于监听客户端socket的连接请求
serversocket ss = new serversocket(30000);
//采用循环不断接受来自客户端的请求
while (true)
{
//每当接受到客户端socket的请求,服务器端也对应产生一个socket
socket s = ss.accept();
outputstream os = s.getoutputstream();
os.write("您好,您收到了服务器的消息!\n"
.getbytes("utf-8"));
//关闭输出流,关闭socket
os.close();
s.close();
}
//客户端
socket socket = new socket("192.168.1.88" , 30000);
//将socket对应的输入流包装成bufferedreader
bufferedreader br = new bufferedreader(
new inputstreamreader(socket.getinputstream()));
//进行普通io操作
string line = br.readline();
show.settext("来自服务器的数据:" + line);
br.close();
socket.close();


udp连接示例:

复制代码 代码如下:


view code
服务器端:
try {
//创建一个datagramsocket对象,并指定监听的端口号
datagramsocket socket = new datagramsocket(4567);
byte data [] = new byte[1024];
//创建一个空的datagrampacket对象
datagrampacket packet = new datagrampacket(data,data.length);
//使用receive方法接收客户端所发送的数据
socket.receive(packet);
string result = new string(packet.getdata(),packet.getoffset(),packet.getlength());
system.out.println("result--->" + result);
} catch (exception e) {
// todo auto-generated catch block
e.printstacktrace();
客户端:
try {
//首先创建一个datagramsocket对象
datagramsocket socket = new datagramsocket(4567);
//创建一个inetaddree
inetaddress serveraddress = inetaddress.getbyname("192.168.1.104");
string str = "hello";
byte data [] = str.getbytes();
//创建一个datagrampacket对象,并指定要讲这个数据包发送到网络当中的哪个地址,以及端口号
datagrampacket packet = new datagrampacket(data,data.length,serveraddress,4567);
//调用socket对象的send方法,发送数据
socket.send(packet);
} catch (exception e) {
// todo auto-generated catch block
e.printstacktrace();
}


以上,是我的总结,最近正在做一个类似网络视频客户端的作品,如果大家有人做过这方面,欢迎您们提出建议和实现终端和服务器访问的其他方法。谢谢!
与大家共勉!!!