由于一个项目的需要,我研究了一下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         }
  以上,是我的总结,最近正在做一个类似网络视频客户端的作品,如果大家有人做过这方面,欢迎您们提出建议和实现终端和服务器访问的其他方法。谢谢!
 与大家共勉!!!
  
 
   本文链接