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. JS图片自己主动轮换效果实现

    今天不在状态,五一快到了,俺就特想玩了.好了,天色已晚,闲话不多说,看下用javaScript 实现的图片自己主动轮换效果,先看图片 以下是详细的代码,还是比較简单的. <!DOCTYPE ht ...

  2. Selenium2+python自动化44-元素定位参数化(find_element)

    前言 元素定位有八种方法,这个能看到这一篇的小伙伴都知道了,那么有没有一种方法,可以把八种定位合为一种呢?也就是把定位的方式参数化,如id,name.css等设置为一个参数,这样只需维护定位方式的参数 ...

  3. icanhazip.com 使你在不论什么地方知道你的公网IP地址

    icanhazip.com 使你在不论什么地方知道你的公网IP地址 icanhazip.com是一个网址,你在浏览器中输入这个网址,你就能得到你的公网IP地址了. 我在Linux下一般使用curl i ...

  4. 一个自带简易数据集的模拟线性分类器matlab代码——实验训练

      %%%% Tutorial on the basic structure of using a planar decision boundary %%%% to divide a collecti ...

  5. 使用开源库 MBProgressHUD 等待指示器

    source https://github.com/jdg/MBProgressHUD MBProgressHUD is an iOS drop-in class that displays a tr ...

  6. Maven最佳实践:Maven仓库

    什么是Maven仓库 在不用Maven的时候,比如说以前我们用Ant构建项目,在项目目录下,往往会看到一个名为/lib的子目录,那里存放着各类第三方依赖jar文 件,如log4j.jar,junit. ...

  7. Endianess(字节次序)简介

    1. 基础 在解释Endianess前,需要先明白几个基础定义 1) 数据的高位与低位是什么 以1001001为例,则从左边算起是 高位 -> 低位, 简而言之就是左边是高位,右边是低位 而内存 ...

  8. POJ 1753 Flip Game (枚举)

    Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 26492   Accepted: 11422 Descr ...

  9. iframe多层嵌套时获取元素

    一.同域:1.父页面获取子页面元素:注意:onload事件jQuery获取:$("iframe").contents().find("holder")..... ...

  10. android 随手记 摄像头录像

    1 xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:androi ...