一、Socket
套接字(Socket)是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议栈进行交互的接口。Socket的出现,使得程序员可以很方便地访问 TCPIP,从而开发各种网络应用程序。后来套接字被引进到 Windows等操作系统,成为开发网络应用程序的有效工具。
套接字的主要类型有以下三种:
- 流套接字:用于提供面向连接、可靠的数据传输服务。该服务将保证数据能够实现无差错、无重复送,并按顺序接收。流套接字之所以能够实现可靠的数据服务,原因在于其使用了传输控制协议TCP。
- 数据报套接字:提供一种无连接的服务。该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。数据报套接字使用UDP协议进行数据的传输。
- 原始套接字:可以读写内核没有处理的IP数据包,而流套接字只能读取TCP协议的数据,数据报套接字只能读取UDP协议的数据。因此,如果要访问其他协议发送的数据必须使用原始套接。
要通过互联网进行通信,至少需要一对套接字,其中一个运行于客户端,我们称之为 Client Socket,另一个运行于服务器端,我们称之为 Server Socket。套接字之间的连接过程可以分为三个步骤:
- 服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
- 客户端请求:客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字知道服务器端套接字的地址和端口号,然后才能向服务器端接字提出连接请求。
- 连接确认:服务器端套接字监听到客户端套接字的连接请求,就会响应客户端套接字的请求,建立一个新的线程,并把服务器端套接字的描述发送给客户端。一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,接收其他客户端套接字的连接请求。
根据套接字的不同类型,可以将套接字调用分为面向连接服务和无连接服务,面向连接服务的主要特点如下:
- 数据传输过程必须经过建立连接、维护连接和释放连接3个阶段。
- 在传输过程中,各分组不需要携带目的主机的地址 。
- 可靠性好,但由于协议复杂,通信效率不高 。
- 不需要连接的各个阶段。
- 每个分组都携带完整的目的主机地址,在系统中独立传送。
- 由于没有顺序控制,所以接收方的分组可能出现乱序、重复和丢失现象。
- 通信效率高,但可靠性不能确保。
二、WebSocket
WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手(由浏览器端发起),两者之间就直接可以创建持久性的连接,并进行双向数据传输。
很多网站为了实现推送技术,所用的技术都是轮询。轮询是在特定的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。
三、WebSocket与Socket的关系
它们是两个不同的概念,Socket是进程之间进行双向通信的端点的抽象,就像水管的两端;WebSocket是一种建立在TCP连接上进行全双工通信的协议,是HTML5的产物,作为HTML5的一部分,大部分主流浏览器都支持WebSocket,并提供了WebSocket API。
四、WebSocket API
WebSocket 对象提供了用于创建和管理 WebSocket 连接,以及可以通过该连接发送和接收数据的 API。
- 创建WebSocket:var aWebSocket = new WebSocket(url [, protocols]); url表示要连接的服务端Socket地址,protocols表示协议数组(可选)。
- WebSocket实例属性:
- binaryType:返回传输二进制数据的类型;
- bufferedAmount:返回已经被send()方法放入队列中但还没有被发送到网络中的数据的字节数;
- extensions:返回服务器已选择的扩展值;
- protocol:返回服务器端选中的子协议的名称;
- readyState:返回当前WebSocket的链接状态(WebSocket.CONNECTING、websocket.open、WebSocket.CLOSING、WebSocket.CLOSED);
- url:返回值为当构造函数创建WebSocket实例对象时 URL 的绝对路径。
- WebSocket实例方法:
- close():关闭连接;
- send():需要通过 WebSocket 链接传输至服务器的数据排入队列。
- WebSocket事件:
- close:连接关闭触发事件;
- error:连接发生错误触发事件;
- message:收到新消息时触发事件;
- open:连接成功时触发事件。