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
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已连接') } }
const onopenWS = () => { sendPing() }
const onerrorWS = () => { Socket.close() clearInterval(setIntervalWesocketPush) console.log('连接失败重连中') if (Socket.readyState !== 3) { Socket = null createSocket() } }
const onmessageWS = e => { window.dispatchEvent(new CustomEvent('onmessageWS', { detail: { data: e.data } })) }
const connecting = message => { setTimeout(() => { if (Socket.readyState === 0) { connecting(message) } else { Socket.send(JSON.stringify(message)) } }, 1000) }
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() } }
export const sendPing = (time = 5000, ping = 'ping') => { clearInterval(setIntervalWesocketPush) Socket.send(ping) setIntervalWesocketPush = setInterval(() => { Socket.send(ping) }, time) }
|