Socket.IO 由两部分组成
- 与Node.JS HTTP Server集成(或安装)的服务器
- 在浏览器端加载的客户端库
主要特性
可靠性
因为防火墙会关闭长时间处于非活跃状态的连接而导致socket连接中断,通过心跳机制可以保持长连接。
自动重新连接支持
除非得到指示,客户端会一直尝试重新连接到服务器,直到连接成功
断线检测
在Engine.IO层实现心跳机制,允许服务器和客户端知道另一个机制何时不响应
通过在服务器和客户端上设置定时器来实现该功能,在连接握手期间共享超时值(pingInterval和pingTimeout参数)
二进制支持
可以发出任何可序列化的数据结构
多路复用支持
为了在应用程序中创建关注点分离(例如,每个模块或基于权限),Socket.IO允许您创建多个命名空间,这些命名空间将充当单独的通信通道,但将共享相同的底层连接。
房间支持
在每个命名空间中,您可以定义套接字可以加入和离开的任意通道,称为Rooms。 然后,您可以广播到任何给定的房间,到达已加入它的每个套接字。
这是一个非常有用的功能,可以将通知发送给一组用户,或者发送给连接在多个设备上的给定用户。
这些功能带有一个简单方便的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});
Socket.IO不是WebSocket实现。 尽管Socket.IO确实在可能的情况下使用WebSocket作为传输,但它会为每个数据包添加一些元数据:数据包类型,命名空间和需要消息确认时的确认ID。 这就是为什么WebSocket客户端无法成功连接到Socket.IO服务器,并且Socket.IO客户端也无法连接到WebSocket服务器。
Socket.IO允许您发出和接收自定义事件。 除了连接,消息和断开连接,您还可以发出自定义事件