由于一个项目的需要,我研究了一下android的网络通信方式,大体和java平台的很相似!
android平台也提供了很多的API供开发者使用,请按示例图:
首先,介绍一下通过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时的示例代码:
1 // 创建DefaultHttpClient对象
2 HttpClient httpClient = new DefaultHttpClient();
3 // 创建一个HttpGet对象
4 HttpGet get = new HttpGet(
5 "http://192.168.1.88:8888/foo/secret.jsp");
6 try
7 {
8 // 发送GET请求
9 HttpResponse httpResponse = httpClient.execute(get);
10 HttpEntity entity = httpResponse.getEntity();
11 if (entity != null)
12 {
13 // 读取服务器响应
14 BufferedReader br = new BufferedReader(
15 new InputStreamReader(entity.getContent()));
16 String line = null;
17 response.setText("");
18 while ((line = br.readLine()) != null)
19 {
20 // 使用response文本框显示服务器响应
21 response.append(line + "\n");
22 }
23 }
24 }
25 catch (Exception e)
26 {
27 e.printStackTrace();
28 }
29 }
post请求HttpPost的示例代码:
1 HttpClient httpClient=new DefaultHttpClient();
2 HttpPost post = new HttpPost(
3 "http://192.168.1.88:8888/foo/login.jsp");
4 // 如果传递参数个数比较多的话可以对传递的参数进行封装
5 List<NameValuePair> params = new ArrayList<NameValuePair>();
6 params.add(new BasicNameValuePair("name", name));
7 params.add(new BasicNameValuePair("pass", pass));
8 try
9 {
10 // 设置请求参数
11 post.setEntity(new UrlEncodedFormEntity(
12 params, HTTP.UTF_8));
13 // 发送POST请求
14 HttpResponse response = httpClient
15 .execute(post);
16 // 如果服务器成功地返回响应
17 if (response.getStatusLine()
18 .getStatusCode() == 200)
19 {
20 String msg = EntityUtils
21 .toString(response.getEntity());
22 // 提示登录成功
23 Toast.makeText(HttpClientTest.this,
24 msg, 5000).show();
25 }
26 }
27 catch (Exception e)
28 {
29 e.printStackTrace();
30 }
31 }
其次,介绍一下,使用java包的工具进行通信,也分get和post方式
默认使用get方式,示例代码:
1 try
2 {
3 String urlName = url + "?" + params;
4 URL realUrl = new URL(urlName);
5 // 打开和URL之间的连接或者HttpUrlConnection
6 URLConnection conn =realUrl.openConnection();
7 // 设置通用的请求属性
8 conn.setRequestProperty("accept", "*/*");
9 conn.setRequestProperty("connection", "Keep-Alive");
10 conn.setRequestProperty("user-agent",
11 "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
12 // 建立实际的连接
13 conn.connect();
14 // 获取所有响应头字段
15 Map<String, List<String>> map = conn.getHeaderFields();
16 // 遍历所有的响应头字段
17 for (String key : map.keySet())
18 {
19 System.out.println(key + "--->" + map.get(key));
20 }
21 // 定义BufferedReader输入流来读取URL的响应
22 in = new BufferedReader(
23 new InputStreamReader(conn.getInputStream()));
24 String line;
25 while ((line = in.readLine()) != null)
26 {
27 result += "\n" + line;
28 }
29 }
30 catch (Exception e)
31 {
32 System.out.println("发送GET请求出现异常!" + e);
33 e.printStackTrace();
34 }
35 // 使用finally块来关闭输入流
使用post的示例代码:
1 try
2 {
3 URL realUrl = new URL(url);
4 // 打开和URL之间的连接
5 URLConnection conn = realUrl.openConnection();
6 // 设置通用的请求属性
7 conn.setRequestProperty("accept", "*/*");
8 conn.setRequestProperty("connection", "Keep-Alive");
9 conn.setRequestProperty("user-agent",
10 "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
11 // 发送POST请求必须设置如下两行
12 conn.setDoOutput(true);
13 conn.setDoInput(true);
14 // 获取URLConnection对象对应的输出流
15 out = new PrintWriter(conn.getOutputStream());
16 // 发送请求参数
17 out.print(params);
18 // flush输出流的缓冲
19 out.flush();
20 // 定义BufferedReader输入流来读取URL的响应
21 in = new BufferedReader(
22 new InputStreamReader(conn.getInputStream()));
23 String line;
24 while ((line = in.readLine()) != null)
25 {
26 result += "\n" + line;
27 }
28 }
29 catch (Exception e)
30 {
31 System.out.println("发送POST请求出现异常!" + e);
32 e.printStackTrace();
33 }
从以上知,get请求只需要conn.connect(),post请求时,必须设置 conn.setDoOutput(true),conn.setDoinput(true),还必须获取URLConnection的输出流getOutputStream()
最后,使用套接字(soket)进行通信分为两种形式:面向连接的(tcp)和无连接的(udp 数据报)
tcp连接示例:
//服务器端
//创建一个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连接示例:
1 服务器端:
2 try {
3 //创建一个DatagramSocket对象,并指定监听的端口号
4 DatagramSocket socket = new DatagramSocket(4567);
5 byte data [] = new byte[1024];
6 //创建一个空的DatagramPacket对象
7 DatagramPacket packet = new DatagramPacket(data,data.length);
8 //使用receive方法接收客户端所发送的数据
9 socket.receive(packet);
10 String result = new String(packet.getData(),packet.getOffset(),packet.getLength());
11 System.out.println("result--->" + result);
12 } catch (Exception e) {
13 // TODO Auto-generated catch block
14 e.printStackTrace();
15
16
17 客户端:
18
19 try {
20 //首先创建一个DatagramSocket对象
21 DatagramSocket socket = new DatagramSocket(4567);
22 //创建一个InetAddree
23 InetAddress serverAddress = InetAddress.getByName("192.168.1.104");
24 String str = "hello";
25 byte data [] = str.getBytes();
26 //创建一个DatagramPacket对象,并指定要讲这个数据包发送到网络当中的哪个地址,以及端口号
27 DatagramPacket packet = new DatagramPacket(data,data.length,serverAddress,4567);
28 //调用socket对象的send方法,发送数据
29 socket.send(packet);
30 } catch (Exception e) {
31 // TODO Auto-generated catch block
32 e.printStackTrace();
33 }
以上,是我的总结,最近正在做一个类似网络视频客户端的作品,如果大家有人做过这方面,欢迎您们提出建议和实现终端和服务器访问的其他方法。谢谢!
与大家共勉!!!
本文链接