Web 全栈推拉能手 Socket.IO 库

摘要:Socket.IO 不仅支持 WebSocket,还支持许多种轮询机制以及其他实时通信方式,并封装了通用的接口。这些方式包含 Adobe Flash Socket、Ajax 长轮询、Ajax multipart streaming 、持久 Iframe、JSONP 轮询等

Web 前端与后台的通信

  • 短轮询:通过不断发送 http 请求达到即时通信的目的

  • 长轮询:访问无资源并不会立刻返回,保持较长时间的通讯,直到获得数据或超时返回。

  • WebSocket:基于 TCP 协议,兼容 HTTP 协议的基础上,做协议升级,在 HTML5 中提供 client 和 server 进行全双工通信。

Socket.IO

Socket.IO 是一个封装了 Websocket、基于 Node 的 JavaScript 框架,包含 client 的 JavaScript 和 server 的 Node。其屏蔽了所有底层细节,让顶层调用非常简单。

Socket.IO 的协议

Socket.IO 的协议基于 engine.io 的版本,目前最新版本是 4。GO 的 socket.io 库是 github.com/graarh/golang-socketio,仅支持 EIO=3 的协议版本。

准备全栈 Socket.IO 库

前端 (React typescript):

  • "socket.io-client": "2.3.0"

  • "@types/socket.io-client": "^1.4.33"

后端 (golang)

go get github.com/graarh/golang-socketio

go get github.com/graarh/golang-socketio/transport

使用 Socket.IO

后端

创建对象

server := gosocketio.NewServer(transport.GetDefaultWebsocketTransport())

Server 类型实现了 http.Handler 接口,可以无缝衔接各 web 框架,例如: http.Handle ("/socket.io",server)。

响应事件

//预设

server.on(gosocketio.OnConnection,func(c *gosocketio.Channel){})

server.on(gosocketio.OnDisConnection,func(c *gosocketio.Channel){})

server.on(gosocketio.OnError,func(c *gosocketio.Channel){})



//自定义事件

server.On("send", func(c *gosocketio.Channel, msg Message) string {})

推送数据

//回复消息

c.Emit("event","message")



//广播消息

c.BroadcastTo("room","event","message")

server.BroadcastTo("room","event","message")

Channel 的 BroadcastTo 函数在内部实现上调用了 Server 的 BroadcastTo 函数。

这里涉及到房间的概念,房间是对访问者的归类,用于局部分类广播消息,加入房间方法为 c.Join ("roomName")。

前端 (React typescript)

创建对象

import * as io from 'socket.io-client';

let socket:SocketIOClient.Socket

socket = io.connect("ws://", { transports: ['websocket'] })

响应事件

socket.on("events", (data: any) => {})

发送消息

socket.emit("events","message")

总结

Socket.IO 不仅支持 WebSocket,还支持许多种轮询机制以及其他实时通信方式,并封装了通用的接口。这些方式包含 Adobe Flash Socket、Ajax 长轮询、Ajax multipart streaming 、持久 Iframe、JSONP 轮询等。换句话说,当 Socket.IO 检测到当前环境不支持 WebSocket 时,能够自动地选择最佳的方式来实现网络的实时通信。

PS: 目前编者还未找到支持 Engine.IO 版本 4 协议的 GO 语言库,所以只能降低客户端 socket.io-client 的版本以完成前后端的适配。

本文来自GoCN

本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://shenqiku.cn/article/FLY_11764