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时的示例代码:
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 }
以上,是我的总结,最近正在做一个类似网络视频客户端的作品,如果大家有人做过这方面,欢迎您们提出建议和实现终端和服务器访问的其他方法。谢谢!
与大家共勉!!!
posted on 2012-11-21 01:18 woyuchengxian 阅读(2662) 评论(0) 编辑 收藏 举报