socket.io

参考

https://socket.io/docs
https://www.jianshu.com/p/a3e06ec1a3a0

Socket.IO不是WebSocket实现。尽管Socket.IO确实在可能的情况下使用WebSocket作为传输,但它在每个数据包中添加了一些元数据:需要消息确认时的数据包类型、命名空间和数据包id。这就是为什么WebSocket客户端无法成功连接到Socket.IO服务器,而Socket.IO客户端也无法连接到WebSocket服务器。[请参阅此处的协议规范](https://github.com/socketio/socket.io-protocol)。

服务端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
io.on('connection', function(socket){
// 发给这单个socket
socket.emit('request', /* */);

// 发给所有人,除了自己
socket.broadcast.emit('llc connected');

// 发送给全部已连接的socket
io.emit('broadcast', /* */);

// 监听掉线
socket.on('disconnect', function () {
io.emit('user disconnected');
});

});

// namespace
var chat = io
.of('/chat')
.on('connection', function (socket) {
socket.emit('a message', {
that: 'only',
'/chat': 'will get'
});
chat.emit('a message', {
everyone: 'in',
'/chat': 'will get'
});
});

客户端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var socket = io();
// 监听消息
socket.on('request', (msg)=>{

})

// 监听连接上了服务器
socket.on('connect', function () {
socket.emit('ferret', 'tobi', 'woot', function (data) {
console.log(data);
});
});

// 发送消息
socket.emit('reply', {a:1})

// namespace chat
var chat = io.connect('http://localhost/chat')