We can't find the internet
Attempting to reconnect
### 简介
`Socket.io`曾经是 websocket 持久连接的唯一选择,具有最好的浏览器兼容性。随着时间
的推移,浏览器都已经支持 websocket 技术,这种持久连接库渐渐的淡出了。
### 依赖模块
```json
"debug": "~4.1.0",
"engine.io": "~3.4.0",
"has-binary2": "~1.0.2",
"socket.io-adapter": "~1.1.0",
"socket.io-client": "2.3.0",
"socket.io-parser": "~3.4.0"
```
#### 模块功能说明
- engine.io Engine.IO 是 Socket.IO 实现基于传输的跨浏览器/跨设备双向通信层。
- socket.io-adapter 用户管理用户和连接的默认适配器,如果启动 socket.io cluster,
可是使用 socket.io-redis
- socket.io-client socket.io 客户端
- socket.io-parser 用 JavaScript 编写的符合 socket.io-protocol 版本 4 的
socket.io 编码器和解码器。 由 socket.io 和 socket.io-client 使用。
### 功能开发
#### 使用接入认证
实现方式是在建立连接的时候检查请求,可以同作配置功能来处理
```js
const authorization = (request, cb) => {
console.log('==== athorization ====');
const {headers} = request;
const clientRequest = http
.get(
{
...addr,
rejectUnauthorized: false,
headers: {
cookie: headers.cookie,
},
},
(res) => {
let buf = Buffer.from('');
res.on('data', (b) => {
buf = Buffer.concat([buf, b]);
});
res.on('end', (b) => {
const s = buf.toString('utf-8');
const d = JSON.parse(s);
if (d.role) {
cb(null, d.role);
} else {
cb(null);
}
});
},
)
.on('error', (e) => cb(e));
};
io.set('authorization', authorization);
```
同样也可以使用 io.use 来对请求做准入验证
```js
io.use((socket, next) => {
const {headers} = socket.request;
// do some check
checkHeaderInfo(headers)
.then(() => next())
.catch((e = new Error(e)));
});
```
#### 连接复用与隔离
当多个应用需要复用一条连接时,我们需要配置相关的隔离来处里对应的业务
socket.io 提供了两种方式做隔离
1. namespace
2. room
##### namespace
当前默认会有一个 namespace,默认的 namespace 调用位置为
```js
const defaultNS = io.sockets || io.of('/');
```
每个 namespace 下都可以做单独的认证配置和创建自己的 room
namespace 可以在 client 控制
client 控制方式:
```js
const socket = io('http://server.address', {path: 'socket'});
const nsSocket = socket.socket('/someNamespace');
```
##### room
每个用户默认会加入一个名称为自己连接的 ID 的 room
只能够在 server 加入 room,加入方式为:
```js
io.on('connection', (socket) => {
socket.join('soom room', (room) => {
console.log('join room success');
});
});
```
### 官方文档
Socket.io [地址](https://github.com/socketio/socket.io/blob/master/docs/API.md)
Socket.io-client
[地址](https://github.com/socketio/socket.io-client/blob/master/docs/API.md)