之前对于socket几乎一无所知。只在之前看过一个演讲说socket的,最近发现socket应用场景非常多,所以特意花时间研究了一下socket.io 话说socket.io真的是简单,完全不需要对socket有任何了解,socket.io帮你把服务端和客户端都写的好好的了

socket.io的用法

使用起来非常简单,后端只要创建一个http server,然后作为socket.io的参数然后socket服务器就完成了。socket的端口就是http server所监听的端口

1
2
3
var server = require('http').createServer(app);
var io = require('socket.io')(server);
server.listen(3000)

网页端socket.io也准备好了,直接io.connect()就好了

1
var socket = io.connect('http://server.domain:3000');

方法常用的也就一个简单的io.on()来监听socket的事件,第一个参数是字符串表示事件,第二个参数是回调函数,参数是socket对象

socket对象也就两个方法,一个socket.on()来监听socket会话的事件,一样第一个参数是事件名,第二个参数是回调,参数是客户端发来的消息。还有一个方法是socket.emit()用来给对方发消息,第一个参数是消息类型,第二个参数是消息内容。

要想给连接发消息可以用socket.broadcast.emit(),想给所有连接发消息可以io.sockets.emit()

其他的功能还有命名空间、房间、中间件什么的,具体可以看socket.io的代码

socket身份验证

如果要验证身份的话可以在连接建立后,先自行商议一个auth事件,然后进行身份验证的处理,然后如果通过了直接给socket对象设置一个验证通过的属性,在后面每次接收消息的时候都验证一下。如果没通过验证可以不管,也可以返回错误消息或者直接从服务端断开连接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
io.on('connection', (socket) => {
socket.on('auth', (msg) => {
// 身份验证
if (authentication) {
socket.auth = true
// ...
} else {
socket.auth = false
// ...
}
})

socket.use('message', (next) => {
if (socket.auth) {
next()
} else {
socket.disconnect()
}
})

socket.on('message', (msg) => {
// ...
})
})