Android网络开发之Socket通信
HTTP通信中Client发送的每次请求都需要Server回送响应,在请求结束后,Client会主动释放连接。从建立连接到隔壁连接的过程成为一次连接。要保持Client程序的在线状态,需要不断地向Server发送请求。通常的做法是,即使不需要获取任何数据,Client也保持每隔一段固定的时间向Server发送一次保持连接的请求,Server在收到该请求后对Client进行回复,表明知道Client在线。若Server长时间无法收到Client的请求,则认为Client下线,若Client长时间无法收到Server的回复,则认为网络已经断开。
Socket(套接字)用于描述IP地址和端口。App常常通过Socket向网络发出请求或者应答网络请求。Socket是支持TCP/IP协议的网络通信的基本操作单元,是网络通信过程中端点的抽象表示,包含进行网络通信必需的5种信息:网络协议、本地IP地址、本地端口、远程IP地址、远程端口。
Socket有两种传输模式:面向连接和无连接。面向连接的Socket操作就像一部电话,必须建立一个连接。所有的数据达到时的顺序和它们发送时的顺序是一样的。无连接的Socket操作就像一个邮件投递,多个邮件达到时的顺序可能和发送的顺序不一样。到底用哪种模式是由应用程序的需要决定。如果可靠性更重要,用面向连接的模式会更好。确保数据的有序性和正确性需要额外的操作,这会带来内存消耗,降低系统的效率。无连接的操作使用数据报协议。一个数据报是一个独立的单元,它包含了这次投递的所有信息(目的地址、要发送的内容)。这种模式下的Socket不需要连接目的Socket,它只是简单地投出数据报。无连接的操作时快速的和高效的,但数据安全性不佳。面向连接的操作使用TCP协议。面向连接的Socket必须在发送数据之前和目的地Socket取得连接。一旦建立了连接,Socket就可以使用一个流接口来进行打开、读/写、关闭操作。所有发送的信息都会在另一端以同样的顺序接收。面向连接比无连接效率更低,但是数据更安全。
java.net 包中提供Socket和ServerSocket表示双向连接的Client和Server。
在选择端口时必须小心。每个端口提供一种特定的服务,只有给出正确的端口,才能获得相应的服务。端口号0~1023为系统保留。例如80是http服务的,21是telnet服务的,23是ftp服务的。我们在选择端口号时,最好选择一个大于1023的数,防止发生冲突。在创建Socket或ServerSocket时,如果产生错误,将会抛出IOException。
要想在Client使用Socket来与一个Server通信,就必须在Client创建一个Socket,指定ServerIP地址和端口。
例如:Socket socket = new Socket(“192.168.1.110”, 5555);
在Server创建ServerSocket,指定监听的端口。
例如:ServerSocket serverSocket = new ServerSocket(5555);
实际应用中ServerSocket总是不停地循环调用accept()方法,一旦收到请求就会创建线程来处理和响应。accept()是一个阻塞方法,接收到请求后会返回一个Socket来与Client进行通信。
Socket 提供了getInputStream()和getOutputStream()用来得到输入流和输出流进行读写操作,这两个方法分别返回InputStream和OutputStream。为了方便读写,我们常常在InputStream和OutputStream基础上进行包装得到DataInputStream, DataOutputStream, PrintStream, InputStreamReader, OutputStreamWriter, printWriter等。
示例代码:
PrintStream printStream = new PrintStream(new BufferedOutputStream(socket.getOutputStream()));
PrintWriter printWriter = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), true)));
printWriter.println(String msg);
DataInputStream dis = new DataInputStream(socket.getInputStream());
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line = br.readLine();
在关闭socket之前,应将与其有关的stream全部关闭,以释放所有的资源。
Android网络开发之Socket通信的更多相关文章
- iOS开发之Socket通信实战--Request请求数据包编码模块
实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...
- Android网络开发之HttpURLConnection
http是一个可靠的传输,建立在TCP/IP连接之上,缺省端口是80,其他端口号也可以用.Android可以用HttpURLConnection或HttpClient接口来开发http程序. http ...
- Android 网络开发之WIFI
WIFI就是一种无线联网技术,常见的是使用无线路由器.那么在这个无线路由器的信号覆盖的范围内都可以采用WIFI连接的方式进行联网.如果无线路由器连接了一个ADSL线路或其他的联网线路,则又被称为&qu ...
- Android网络开发之用tcpdump抓包
Android开发过程中,当涉及到网络通信的时候,有一些字段须要抓包获取.我之前由于SSDP设备发现的包头格式没有写对,经过抓包分析和标准包头对照发现了这个困扰我非常久的问题.总之,掌握在Androi ...
- Android网络开发之OkHttp--基本用法POST
1.OkHttp框架使用了OkIo框架,不要忘记下OkIo.jar 2.通过POST访问网络,和通过GET访问网络基本相同,多了设置请求参数的过程.主要分为五步: (1).声明并实例化一个OkHttp ...
- Android网络开发之OkHttp--基本用法GET
1.OkHttp框架使用了OkIo.jar包,不要忘记添加. 2.对于Request对象是如何实例化的,大家可以参考--java builder设计模式 http://www.cnblogs.com/ ...
- Android网络开发之Volley--Volley自定义Request
1.自定义一个解析Json的Request,这里使用JackSon框架来解析Json.你也可以自定义一个解析XML的Request,或者使用FastSon来解析Json. 2.我们首先来看一下Stri ...
- Android网络开发之Volley--Volley基本用法ImageRequest(三)
1.ImageRequest用法和StringRequest一样,主要分为3步: (1).实例化一个RequestQueue对象 (2).设置ImageRequest对象参数,并将ImageReque ...
- Android网络开发之Volley--Volley基本用法JsonObjectReques(二)
1.JsonObjectRequest用法 用法和StringRequest基本相同,主要分为3步: (1).实例化一个RequestQueue对象 (2).设置JsonObjectRequest对象 ...
随机推荐
- Log4net 配置输出文本, 按年月日分文件夹 z
在项目中新建 “log4net.config” 文件 <?xml version="1.0" encoding="utf-8" ?> <con ...
- 项目bug的修正
这几个月来,大部分业余时间,都花在阅读软件工程和编译原理方面的书籍上了.软件工程方面的书,包括软件需求.风险管理.敏捷建模,系统设计,软件项目管理,还有一些类似于的沉思录书籍等. 在这些书中,都只是讲 ...
- UT-Austin大学在Image search and large-scale retrieval方面的一系列papers
WhittleSearch: Interactive Image Search with Relative Attribute Feedback. A. Kovashka, D. Parikh, a ...
- 卡方检验(Chi-square test/Chi-Square Goodness-of-Fit Test)
什么是卡方检验 卡方检验是一种用途很广的计数资料的假设检验方法.它属于非参数检验的范畴,主要是比较两个及两个以上样本率( 构成比)以及两个分类变量的关联性分析.其根本思想就是在于比较理论频数和实际频数 ...
- 使用Scala
1. 净资产应用实例 我们要构建这样一个应用,它会取回一份列表,其中包括用户持有的股票的代码以及股份,并告知他们在当前日期为止的这些投资的总价.这包含了几件事:获取用户输入.读文件.解析数据.写文件. ...
- 正则表达式和grep
本章主要通过一些应用实例,来对正则表达式进行说明. 1.正则表达式 正则表达式就是字符串的表达式.它能通过具有意义的特殊符号表示一列或多列字符串.grep是linux系统下常用的正则表达式工具,可以使 ...
- jquery 返回顶端组件
自己写了一个基于jquery的返回页面顶端的组件. (function($) { var g; $.backtop = function(options) { extend($.backtop.con ...
- IDEA是如何导入项目的,及启动导入项目遇到的问题:无法加载主类的一连串问题
1.启动报错误: 找不到或无法加载主类 org.spring.springboot.Application 可能在工程下面有多个module,然后,module里面的iml配置文件不止一个,删除留主的 ...
- Python3 写Windows Service服务程序
用Python开发Windows Service,用Python来做这个事情必须要借助第三方模块pywin32,下载路径:https://pypi.org/project/pywin32/#files ...
- leetcode 二分查找 Search in Rotated Sorted ArrayII
Search in Rotated Sorted Array II Total Accepted: 18500 Total Submissions: 59945My Submissions Follo ...