Android之网络通信

 

由于一个项目的需要,我研究了一下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时的示例代码:

View Code
 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的示例代码:

View Code
 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方式,示例代码:

View Code
 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的示例代码:

View Code
 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连接示例:

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
 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         }

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

与大家共勉!!!

 

posted on 2012-11-21 01:18  woyuchengxian  阅读(2662)  评论(0编辑  收藏  举报

导航