Socket 是网络上两个程序间双向交流连接的一个端点(类似于打电话时的两台手机),基于TCP/IP协议,稳定有序。A socket is one endpoint of a two-way communication link between two programs running on the network. A socket is bound to a port number so that the TCP layer can identify the application that data is destined to be sent to.An endpoint is a combination of an IP address and a port number. Every TCP connection can be uniquely identified by its two endpoints. That way you can have multiple connections between your host and the server.套接字Socket=(IP地址:端口号),套接字的表示方法是点分十进制的lP地址后面写上端口号,中间用冒号或逗号隔开。每一个传输层连接唯一地被通信两端的两个端点(即两个套接字)所确定。例如:如果IP地址是192.168.56.103,而端口号是23,那么得到套接字就是(192.168.56.103:23)。一、Socket通信基本原理首先Socket 通信是基于TCP/IP 网络层上的一种传送方式,我们通常把TCP和UDP称为传输层。Socket是基于应用服务与TCP/IP通信之间的一个抽象,它将TCP/IP协议里面复杂的通信逻辑进行分装,对用户来说,只要通过一组简单的API就可以实现网络的连接。首先,服务端初始化ServerSocket,然后对指定的端口进行绑定,接着对端口及进行监听,通过调用accept方法阻塞,此时,如果客户端有一个socket连接到服务端,那么服务端通过监听和accept方法可以与客户端进行连接。二、工作流程要通过互联网进行通信,至少需要一对套接字,其中一个运行于客户端,我们称之为 Client Socket,另一个运行于服务器端,我们称之为 Server Socket。根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:1. 服务器监听所谓服务器监听,是指服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。2. 客户端请求所调客户端请求,是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端接字提出连接请求。3. 连接确认所谓连接确认,是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,就会响应客户端套接字的请求,建立一个新的线程,并把服务器端套接字的描述发送给客户端。一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,接收其他客户端套接字的连接请求。三、长连接和短连接1. 长连接指在一个连接上可以连续发送多个数据包,在连接保持期间,如果没有数据包发送,需要双方发链路检测包。整个通讯过程,客户端和服务端只用一个Socket对象,长期保持Socket的连接。长连接过程:连接→数据传输→保持连接(心跳)→数据传输→保持连接(心跳)→……→关闭连接。这就要求长连接在没有数据通信时,定时发送数据包(心跳),以维持连接状态。2. 短连接短连接服务是每次请求都建立链接,交互完之后关闭链接。其实区分长、短连接就是:整个客户和服务端的通讯过程是利用一个Socket还是多个Socket进行的。3. 长连接与短连接的比较长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况。每个TCP连接都需要三步握手,这需要时间。如果每个操作都是短连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,下次处理时直接发送数据包就OK了,不用建立TCP连接。例如:数据库的连接用长连接,如果用短连接频繁的通信会造成Socket错误,而且频繁的Socket 创建也是对资源的浪费。Socket是针对应用层与TCP/IP数据传输协议封装的一套方案,那么它的底层也是通过TCP/IP或则UDP通信的,所以说Socket本身并不是一套通信协议,而是一套接口的封装。而TCP/IP协议组里面的应用层包括FTP、HTTP、TELNET、SMTP、DNS等协议,我们知道,http1.0是短连接,http1.1是长连接。我们在打开http通信协议里面在Request Headers中可以看到:Connection: keep-alive。对应的Response Headers也可以看到。它是干什么的?它就是表示长连接,但是它并不是一直保持的连接,有一个时间段(Connection Timeout)。如果我们想一直保持这个连接怎么办?那就是在指定的时间内让客户端和服务端进行一个请求,请求可以是服务端发起,也可以是客户端发起,通常我们是在客户端不定时的发送一个字节数据给服务端,这个就是我们称之为心跳包。
本文出自快速备案,转载时请注明出处及相应链接。