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通信的更多相关文章

  1. iOS开发之Socket通信实战--Request请求数据包编码模块

    实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...

  2. Android网络开发之HttpURLConnection

    http是一个可靠的传输,建立在TCP/IP连接之上,缺省端口是80,其他端口号也可以用.Android可以用HttpURLConnection或HttpClient接口来开发http程序. http ...

  3. Android 网络开发之WIFI

    WIFI就是一种无线联网技术,常见的是使用无线路由器.那么在这个无线路由器的信号覆盖的范围内都可以采用WIFI连接的方式进行联网.如果无线路由器连接了一个ADSL线路或其他的联网线路,则又被称为&qu ...

  4. Android网络开发之用tcpdump抓包

    Android开发过程中,当涉及到网络通信的时候,有一些字段须要抓包获取.我之前由于SSDP设备发现的包头格式没有写对,经过抓包分析和标准包头对照发现了这个困扰我非常久的问题.总之,掌握在Androi ...

  5. Android网络开发之OkHttp--基本用法POST

    1.OkHttp框架使用了OkIo框架,不要忘记下OkIo.jar 2.通过POST访问网络,和通过GET访问网络基本相同,多了设置请求参数的过程.主要分为五步: (1).声明并实例化一个OkHttp ...

  6. Android网络开发之OkHttp--基本用法GET

    1.OkHttp框架使用了OkIo.jar包,不要忘记添加. 2.对于Request对象是如何实例化的,大家可以参考--java builder设计模式 http://www.cnblogs.com/ ...

  7. Android网络开发之Volley--Volley自定义Request

    1.自定义一个解析Json的Request,这里使用JackSon框架来解析Json.你也可以自定义一个解析XML的Request,或者使用FastSon来解析Json. 2.我们首先来看一下Stri ...

  8. Android网络开发之Volley--Volley基本用法ImageRequest(三)

    1.ImageRequest用法和StringRequest一样,主要分为3步: (1).实例化一个RequestQueue对象 (2).设置ImageRequest对象参数,并将ImageReque ...

  9. Android网络开发之Volley--Volley基本用法JsonObjectReques(二)

    1.JsonObjectRequest用法 用法和StringRequest基本相同,主要分为3步: (1).实例化一个RequestQueue对象 (2).设置JsonObjectRequest对象 ...

随机推荐

  1. DruidDataSource配置

    DruidDataSource大部分属性都是参考DBCP的,如果你原来就是使用DBCP,迁移是十分方便的. 参考配置 <bean id="dataSource" class= ...

  2. [翻译] Core Text Objective-C Wrapper

    Core Text Objective-C Wrapper https://github.com/akosma/CoreTextWrapper Introduction(介绍) One of the ...

  3. [MAC OS ] UserDefaults

    reference to : http://www.jianshu.com/p/d59b004b5ea7 1.用UserDefaults存储配置信息 注:本次使用UserDefaults存储信息是在不 ...

  4. 内存及字符串操作篇strlen strchar strcmp strcoll strcpy strdup strstr strtok strspn strrchr bcmp bcopy bzero index memccpy memset

    bcmp(比较内存内容) 相关函数 bcmp,strcasecmp,strcmp,strcoll,strncmp,strncasecmp 表头文件 #include<string.h> 定 ...

  5. Java操作Mongodb 保存/读取java对象到/从mongodb

    从http://central.maven.org/maven2/org/mongodb/mongo-java-driver/选择一个版本进行下载,这里选择的是3.0.0版本,具体下载以下jar包: ...

  6. Ubuntu 12.04 安装配置 Apache2

    Apache2安装 1 我们使用root账户进行安装,首先切换到root账户,输入命令: sudo su 2 安装 Apache2 apt-get install apache2 在浏览器输入你服务器 ...

  7. c# 使用 HttpWebRequest模拟登陆(附带验证码)

    在C#中,可以使用HttpWebRequest进行相关的模拟登陆,登陆后进行相关的操作,比如抓取数据,页面分析,制作相关登陆助手等等. 先说下流程 1.使用httpwebrequest先进入你要登录的 ...

  8. java 切图 判断图片是否是纯色/彩色图片

    首先上切图的代码 /** * 图片剪裁 * @param x 距离左上角的x轴距离 * @param y 距离左上角的y轴距离 * @param width 宽度 * @param height 高度 ...

  9. Postgresql监控pgwatch的搭建

    一,需要环境: You will need a handful of components to make this work: - Apache (webserver) #apache搭建web页面 ...

  10. 通过WebRTC实现实时视频通信(一)

    通过WebRTC实现实时视频通信(一) 通过WebRTC实现实时视频通信(二) 通过WebRTC实现实时视频通信(三) WebRTC,名称源自网页实时通信(Web Real-Time Communic ...