文档详情

基于JavaSocket的自定义协议,实现Android与服务器的长连接.docx

发布:2017-01-21约3.75万字共49页下载文档
文本预览下载声明
基于Java Socket的自定义协议,实现Android与服务器的长连接(一)Socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口,通常也称作套接字。套接字之间的连接过程可以分为三个步骤:客户端请求,服务端回复收到,客户端收到服务端的回复,即三次握手。连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例完成所需的会话。作者:枚杉来源:/a/1190000007670492segmentfault|2016-12-05 17:08javascript:favorBox(open);?收藏 javascript:;?分享 一、基础知识准备在正式给大家介绍自定义协议之前,我们先对网络传输和协议解析的相关知识点做一个基本的介绍,尽管这些知识点我们在学校里学过,但难免会有所遗忘,这里先做一个简单的介绍,以便对后文的内容理解更加顺畅。1. 网络七层协议OSI的7层从上到下分别是:7 应用层、 6 表示层、 5 会话层、 4 传输层、 3 网络层、 2 数据链路层、 1 物理层;其中高层(即7、6、5、4层)定义了应用程序的功能,下面3层(即3、2、1层)主要面向通过网络的端到端的数据流。应用层常见的协议有:HTTP、FTP、SMTP等;常见的传输层有:TCP、UDP。本文主要是基于TCP自定义协议实现客户端与服务端的长连接。2. SocketSocket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口,通常也称作套接字。套接字之间的连接过程可以分为三个步骤:客户端请求,服务端回复收到,客户端收到服务端的回复,即三次握手。连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。3. 位(bit)、字节(byte)“位(bit)”是电子计算机中最小的数据单位。每一位的状态只能是0或1;“字节(Byte)”由8个二进制位构成(即1byte=8bit),它是存储空间的基本计量单位,它能表示到数值范围为0到255(即2的8次方减1);4. 算术移位运算(符号位不变,低位补0)左移运算:12,1的二进制位是1,向左移两位是100,转为十进制数即为4,所以12的运算结果是4;右移运算:72,7的二进制位是111,向右移两位是1,所以72的运算结果是1 。5. Java中各类型占字节数byte??????8位,1个字节?boolean???8位,1个字节?char?16位,2个字节?short?????16位,2个字节?int?32位,4个字节?float?32位,4个字节?double?64位,8个字节?long??????64位,8个字节??6. Java中socket相关函数Socket构造函数 Socket(InetAddress address, int port)throws UnknownHostException, IOExceptionSocket(InetAddress address, int port, InetAddress localAddress, int localPort)throws IOExceptionSocket(String host, int port)throws UnknownHostException, IOExceptionSocket(String host, int port, InetAddress localAddress, int localPort)throws IOException还可以通过以下方式生成socket:SocketFactory.getDefault().createSocket(String address, String port) throws ConnectExceptionSocket方法 getInetAddress(); // 远程服务端的IP地址getPort(); // 远程服务端的端口getLocalAddress(); // 本地客户端的IP地址getLocalPort(); // 本地客户端的端口getInputStream(); // 获得输入流getOutStream(); // 获得输出流Socket状态 isClosed(); // 连接是否已关闭,若关闭,返回true;否则返回falseisConnect(); // 如果曾经连接过,返回true;否则返回falseisBound(); // 如果Socket已经与本地一个端口绑定,返回true;
显示全部
相似文档