1.Socket.IO是什么
socket.io是一个库,支持浏览器和服务器之间的实时、双向和基于事件的通信。它包括:
它的主要特性如下:
实时性
会建立连接,即使存在以下情况:
- 代理和负载均衡服务器。
- 个人防火墙和杀毒软件。
因此,它依赖于Engine.IO--首先建立一个长轮询连接,然后尝试升级,以更好地在侧面“测试”传输,比如WebSocket。有关更多信息,请参见目标部分。
支持自动重连
除非显示指定,否则一个断开连接的客户端将会一直试图重新连接,直到服务器再次可用为止。请在这里查看可用的重新连接选项。
断开检测
Engine.IO层面实现了心跳检测机制,使得服务器和客户端知道对方何时不再响应。
该功能通过在服务器和客户端上设置计时器实现,并在连接握手期间共享超时值(pingInterval和pingTimeout参数)。这些计时器要求将任何后续客户端调用定向到同一服务器,因此在使用多个节点时需要使用sticky-session。
对二进制的支持
任何可序列号的数据结构都可以被发送,包括:
- 浏览器中的ArrayBuffer和Blob。
- Node.js中的ArrayBuffer和Buffer。
多路复用
为了在应用程序中创建关注点分离(例如每个模块或基于权限),Socket.IO允许您创建多个Namespaces,这些Namespaces将作为独立的通信通道,但将共享相同的底层连接。
房间支持
在每个Namespaces中,您可以定义任意的通道,称为Rooms,socket可以连接和离开。然后,您可以向任何给定的房间广播,到达连接它的每个socket。
这是一个有用的特性,可以向一组用户发送通知,或者向连接在多个设备上的给定用户发送通知。
这些特性可以用一个简单而方便的API展示,如下所示:
io.on('connection', function(socket){
socket.emit('request', /* */); // emit an event to the socket
io.emit('broadcast', /* */); // emit an event to all connected sockets
socket.on('reply', function(){ /* */ }); // listen to the event
});
2.Socket.IO不是什么
socketio不是WebSocket网络通信协议的实现。尽管socketio确实在可能的情况下使用WebSocket作为传输。它向每个包添加一些元数据:包类型、名称空间和ack id(当需要消息确认时)。这就是为什么WebSocket客户机不能成功地连接到socketio服务器,并且一个socketio客户端也无法连接到WebSocket服务器。请参见这里的协议规范。
// WARNING: the client will NOT be able to connect!
const client = io('ws://echo.websocket.org');