android网络通信本质分析
来源:互联网 发布:苏州方正软件 编辑:程序博客网 时间:2024/06/03 23:39
下面开始真正的网络编程分析。
对于网络传输,不得不提到网络模型, 网络从下到上分为如下几层:
物理层--数据链路层--网络层--传输层--会话层-- -表示层和应用层
ip协议--tcp协议 --- -- http协议,ftp协议,smtp协议等
手机能够使用互联网功能归根到底是手机底层实现了tcp/ip协议,可以使手机终端通过wifi或者中国移动/联通/电信数据流量建立tcp连接。tcp协议可以对上层提供统一的接口,使上层网络数据的传输建立在“无差别”的网络之上,而这个统一的接口就是socket。tcp/ip只是一个协议族,就像操作系统的运行机制一样,必须具体实现,同时还要提供对外的接口,就像win32是windows操作系统提供的对外接口一样,socket就是tcp/ip协议族提供的对上层应用的接口。从上面的分析不难看出,tcp/ip协议是网络通信必备,那么socket接口也是网络通信必备,无论是超文本传输,文件传输还是点对点通信,其本质都是调用tcp/ip协议的接口socket实现。但这里还有一个问题,我们在传输数据时可以只使用tcp/ip协议,但那样便无法识别传输内容,如果想要使传输的数据有意义,则必须使用到应用层协议,比如web使用http协议作为应用层协议,以封装http文本信息,然后通过tcp/ip协议将其发送到网络上。
在android中可以通过Socket和Http获取网络数据。
1、Socket通信
Java提供了ServerSocket类和Socket类实现客户端和服务端的通信,基本流程和Linux Socket通信一致。
第一,服务端创建套接字,绑定ip地址和端口,并设置为监听模式
第二,客户端创建套接字,连接服务端
第三,服务端收到客户端的请求后创建一个新的套接字与客户端进行通信
第四,客户端与服务端进行全双工通信,直到一方断开连接。
2、Http通信
Http协议采用的是请求-响应的模式,不仅在请求时需要先建立连接,而且需要客户端向服务器发送请求后,服务端才能回复数据。很多情况下,需要服务器主动向客户端推送数据,保持客户端与服务端数据的实时和同步。此时若建立的是Socket连接,服务器就可以直接将数据传送给客户端,但若双方建立的是HTTP连接,则服务器需要等到客户端发送一次请求后才能将数据传回给客户端,因此客户端定时向服务器发送连接请求,不仅可以保持在线,同时也是询问服务端是否有新的数据,如果有就将其传送给客户端。
HTTP获取网路资源可以采用java原本就有的方法,也可以使用android仅有的方法,代码如下。
第一,java采用的方法
<span style="font-size:14px;"> URL url = null;try {url = new URL("http://www.baidu.com");} catch (MalformedURLException e) {// TODO Auto-generated catch blocke.printStackTrace();}try {// 建立连接URLConnection conn = url.openConnection();// 设置参数,如要Post的内容//conn.addRequestProperty(key, value);DataInputStream dis = new DataInputStream(conn.getInputStream());PrintWriter writer = new PrintWriter(conn.getOutputStream());String str = "";while(str != null){str = dis.readUTF();System.out.println(str);}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}</span>
第二,android仅有的方法
<span style="font-size:14px;"> HttpClient client = new DefaultHttpClient(); // HTTP GET HttpGet get = new HttpGet(); URI uri = null;try {uri = new URI("http://www.baidu.com");} catch (URISyntaxException e) {// TODO Auto-generated catch blocke.printStackTrace();} get.setURI(uri); try {HttpResponse result = client.execute(get);InputStream input = result.getEntity().getContent();DataInputStream dis = new DataInputStream(input);String ss = dis.readLine();tvIn.setText(ss);} catch (ClientProtocolException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}// HTTP POSTHttpPost httpRequest = new HttpPost(uri);List<NameValuePair> postParameters = null;try {httpRequest.setEntity(new UrlEncodedFormEntity(postParameters,HTTP.UTF_8));} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();}try {HttpResponse httpresponse = new DefaultHttpClient().execute(httpRequest);} catch (ClientProtocolException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}</span>
http定义了与服务器的交互方法get/post,get的请求数据会附在uri之后,通过?隔开,而post的请求数据放在HTTP包体中,这样设置决定了post的安全级别比get高,而且get请求的数据有限,post请求的数据因为在HTTP包体中,比get请求的数据要多得多。
- android网络通信本质分析
- Android 4.0网络通信编程错误分析 NetworkOnMainThreadException
- 百度贴吧客户端(Android)网络通信行为分析
- 百度贴吧客户端(Android)网络通信行为分析
- android网络编程 -- HTTP通信(02) Android HTTP 通信 [附源码分析]
- Android Socket网络通信
- Android Socket网络通信
- Android HttpClient网络通信
- Android HttpClient网络通信
- Android Socket网络通信
- Android Socket网络通信
- Android HttpClient网络通信
- Android HttpClient网络通信
- Android HttpURLConnection网络通信
- Android Socket网络通信
- android网络通信1
- android 网络通信2
- android 网络通信3
- iOS archive(归档)的总结
- CODEVS 1430 素数判定
- 【iOS知识学习】_视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear等的区别及用途
- rsync+inotify 进行数据同步
- 长按tableViewCell弹出复制、黏贴菜单
- android网络通信本质分析
- MongoDB:用户认证
- 一致性hash分片
- openfire asmack java.lang.IllegalStateException: Not connected to server.错误解决办法
- Android系统详解之获取图片和视频的缩略图
- ACM-背包问题Bone Collector&&饭卡
- TCP/IP相关知识复习与总结(https/网络程序性能分析)
- Installing PEAR on OSX
- c/c++ error:GetAdaptersInfo调用失败后重复调用,导致内存溢出