0%

SocketIO笔记

Socket.IO可以看作是一个websocket框架,可以在浏览器和服务器之间实现实时、双向和基于事件的通信。

注意事项

笔记摘自:Socket.IO官网文档

学习ing,持续更新中!

如果可能,客户端将尝试建立WebSocket连接,如果没有,客户端将返回HTTP长轮询。

WebSocket是一种通信协议,在服务器和浏览器之间提供全双工和低延迟通道。更多信息可以在这里找到。

因此,在最好的情况下,前提是:

  • 该浏览器支持WebSocket(2020年占所有浏览器的97%
  • 没有元素(代理、防火墙……)阻止客户端和服务器之间的WebSocket连接

Socket.IO不是WebSocket实现。虽然Socket.IO确实尽可能使用WebSocket作为传输,但它为每个数据包添加了额外的元数据。这就是为什么WebSocket客户端将无法成功连接到Socket.IO服务器,而Socket.IO客户端也无法连接到普通的WebSocket服务器。

所以,若前端使用了Socket.IO则后端也要使用Socket.IO。后端笔记见这篇博客,使用Netty-socketio。

扩展:

  • 普通的WebSocket服务器,例如使用javax的api编写的WebSocket服务,见B站课程
  • 对应的前端WebSocket实现有H5的WebSocket API(无心跳机制等)。

安装

1
npm install socket.io-client

示例:

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
let Socket = ''
let setIntervalWesocketPush = null

/**
* 建立websocket连接
* @param {string} url ws地址
*/
export const createSocket = url => {
Socket && Socket.close()
if (!Socket) {
console.log('建立websocket连接')
Socket = new WebSocket(url)
Socket.onopen = onopenWS
Socket.onmessage = onmessageWS
Socket.onerror = onerrorWS
Socket.onclose = oncloseWS
} else {
console.log('websocket已连接')
}
}

/**打开WS之后发送心跳 */
const onopenWS = () => {
sendPing()
}

/**连接失败重连 */
const onerrorWS = () => {
Socket.close()
clearInterval(setIntervalWesocketPush)
console.log('连接失败重连中')
if (Socket.readyState !== 3) {
Socket = null
createSocket()
}
}

/**WS数据接收统一处理 */
const onmessageWS = e => {
window.dispatchEvent(new CustomEvent('onmessageWS', {
detail: {
data: e.data
}
}))
}

/**
* 发送数据但连接未建立时进行处理等待重发
* @param {any} message 需要发送的数据
*/
const connecting = message => {
setTimeout(() => {
if (Socket.readyState === 0) {
connecting(message)
} else {
Socket.send(JSON.stringify(message))
}
}, 1000)
}

/**
* 发送数据
* @param {any} message 需要发送的数据
*/
export const sendWSPush = message => {
if (Socket !== null && Socket.readyState === 3) {
Socket.close()
createSocket()
} else if (Socket.readyState === 1) {
Socket.send(JSON.stringify(message))
} else if (Socket.readyState === 0) {
connecting(message)
}
}

/**断开重连 */
const oncloseWS = () => {
clearInterval(setIntervalWesocketPush)
console.log('websocket已断开....正在尝试重连')
if (Socket.readyState !== 2) {
Socket = null
createSocket()
}
}
/**发送心跳
* @param {number} time 心跳间隔毫秒 默认5000
* @param {string} ping 心跳名称 默认字符串ping
*/
export const sendPing = (time = 5000, ping = 'ping') => {
clearInterval(setIntervalWesocketPush)
Socket.send(ping)
setIntervalWesocketPush = setInterval(() => {
Socket.send(ping)
}, time)
}
若图片不能正常显示,请在浏览器中打开

欢迎关注我的其它发布渠道