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. 关于Unity中Shader的内置值

    Unity provides a handful of builtin values for your shaders: things like current object's transforma ...

  2. 页面中基于JSTL标签调用函数--之${fn:}内置函数

    调用这样一个头文件<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions " ...

  3. Android之zip包换肤(极力推荐)

    转自:http://www.eoeandroid.com/thread-102536-1-1.html 直接上图,以图为证,哈哈 第一图为原始的皮肤:<ignore_js_op> 第二种为 ...

  4. [MAC OS] 常用工具

    1.Charles mac下的抓包.代理神器 比如我想本地配置 到我的开发机上面.我可以通过Charles 下Tools  -> Map Remote 配置跳转. 2.Postman chrom ...

  5. Javascript数组操作及索引

    1:清空数组最高效的做法 parentThis.PaperQuestionStrategiesList.length = 0;   2:push and pop parentThis.PaperQue ...

  6. Linux命令缩写来由

    A 命令 全称 功能 备注 apt AdvancedPackaging Tool APT用来自动下载,配置,安装二进制或者源代码格式的软件包   awk Aho Weiberger and Kerni ...

  7. java操作Hbase实例

    所用HBase版本为1.1.2,hadoop版本为2.4 /* * 创建一个students表,并进行相关操作 */ import java.io.IOException; import java.u ...

  8. Binary Tree Inorder Traversal leetcode java

    题目: Given a binary tree, return the inorder traversal of its nodes' values. For example: Given binar ...

  9. 【北京】低价出售C/C++经典书籍

    都非常新   C++程序设计 5元 高质量C/C++编程指南 8元   C++对象模型 10元 STL源代码剖析 12元 深入浅出MFC 10元 设计模式 10元 C++ primer 8元 面向对象 ...

  10. 编译和使用 MySQL C++ Connector

    记录编译 mysql C and C++ connector 和简单访问数据库. 环境: vs2012,  mysql 5.6.13, 基于x64 0. 软件包 mysql http://dev.my ...