啥是Socket.io

Socket.io是一个类库,可以在浏览器与服务器之间实现实时、双向、基于事件的通信,它包括:

主要特点是:

可靠性

即使存在以下情况也会重新连接:

  • 代理和负载均衡器
  • 个人防火墙和防病毒软件

为此,它依赖在Engine.IO,它首先建立一个长轮询连接,然后尝试升级到更好的传输通道,这些传输在另外一边被tested,比如websocket。有关更多的信息,请参与目标部分,戳此>

支持自动重连

除非得到指令,否,断开客户端会无限重连。直到服务器再次可以可用,请在此处查看可用的更多选项,戳此>

断连检测

Engine.IO级别实现心跳机制,允许服务器和客户端直知道另一方何时不响应。

通过在服务器和客户端上设置定时器来实现该功能,在连接握手期间,共享超时值(pingIntervalpingTimeout 参数),这些定时器需要将任何后续客户端调用定向到同一个服务器,因此在使用多个节点时会出现 sticky-seesion(沾性会话)要求。

支持二进制

任何可序列化的数据结构都可以被发送, 包括:

  • 浏览器中的 ArrayBuffer(数组缓存) 和 Blob(二进制大文件)
  • Node.js中的 ArrayBufferBuffer缓存

支持多路复用

为了在应用程序中创建关注点分离(例如,每个module(模块)或者基于权限),Socket.io 允许你创建多个Namespaces(命名空间),这些命名空间将充当单独的通信通道,但也会共享相同的底层连接。

支持房间

在每个namespace中,你可以定义sockets,可以加入或者离开任意频道,成为Rooms(房间),然后你可以广播到已任何指定的房间,可以发送到已加入的每个socket成员。

这是一个非常有用的功能,可以将通知发送给一组用户,或者发送给连接在多个设备上的指定用户。

这些功能带有一个简单方便的API,如下所示:

  1. io.on('connection',(socket)=>{
  2. socket.emit('request',/**/)//发送一个事件给socket
  3. io.emit('broadcast',/**/) // 发送一个事件给全部连接着的socket
  4. socket.on('reply',()=>{/**/}) //监听事件
  5. })