2020-03-31

                              socket.io博客


1WebSocket 协议

WebSocket是HTML5新增的一种通信协议,其特点是服务端可以主动向客户端推送信息,客户端也可以主动向服务端发送信息,是真正的双向平等对话,属于服务器推送技术的一种。

在WebSocket API中,浏览器和服务器只需要做一个握手的动作,然后浏览器和服务端之间就形成了一条快速通道,两者之间就直接可以数据相互传送,带来的好处是

相互沟通的Header很小,

大概只有2Bytes。

服务器不再被动的接收到浏览器的请求之后才返回数据,而是在有新数据时就主动推送给浏览器。

为了建立一个WebSocket连接,浏览器首先要向服务器发起一个HTTP请求,这个请求和通常的HTTP请求不同,包含了一些附加头信息,其中附加头信息Upgrade: WebSocket表明这是一个申请协议升级的HTTP请求。服务端解析这些头信息,然后产生应答信息返回给客户端,客户端和服务端的WebSocket连接就建立起来了。双方就可以通过这个连接通道自由的传递信息,并且这个连接会持续直到客户端或者服务端的某一方主动关闭连接。

2Socket.io 基本应用

socket.io提供了基于事件的实时双向通讯,它同时提供了服务端和客户端的API。

服务端

服务端socket.io必须绑定一个http.Server实例,因为WebSocket协议是构建在HTTP协议之上的,所以在创建WebSocket服务时需调用HTTP模块并调用其下createServer()方法,将生成的server作为参数传入socket.io。

由于HTTP是无状态的协议,要实现即时通讯非常困难。因为当对方发送一条消息时,服务器并不知道当前有哪些用户等着接收消息,当前实现即时通讯功能最为普遍的方式就是轮询机制。即客户端定期发起一个请求,看看有没有人发送消息到服务器,如果有服务端就将消息发给客户端。这种做法的缺点显而易见,那么多的请求将消耗大量资源,大量的请求其实是浪费的。

现在,我们有了WebSocket,它是HTML5的新API。WebSocket连接本质上就是建立一个TCP连接,WebSocket会通过HTTP请求建立,建立后的WebSocket会在客户端和服务端建立一个持久的连接,直到有一方主动关闭该连接。所以,现在服务器就知道有哪些用户正在连接了,这样通讯就变得相对容易了。

隐式绑定

socket.io内部实例化并监听http.Server,通过实例化时传入端口或者在实例化后调用listen或attach函数进行隐式绑定。


建立连接

当服务端和客户端连接成功时,服务端会监听到connection和connect事件,客户端会监听到connect事件,断开连接时服务端对应到客户端的socket与客户端均会监听到disconcect事件。

传输数据

服务端和客户端的socket是一个关联的EventEmitter对象,客户端socket派发的事件可以通过被服务端的socket接收,服务端socket派发的事件也可以被客户端接收。基于这种机制,可以实现双向交流。

你可能感兴趣的:(2020-03-31)