Web 全栈推拉能手 Socket.IO 库

更新日期: 2022-06-20阅读: 1.8k标签: socket

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://fly63.com/article/detial/11764

web Socket和Socket.IO框架

HTTP无法轻松实现实时应用:HTTP协议是无状态的,服务器只会响应来自客户端的请求,但是它与客户端之间不具备持续连接。我们可以非常轻松的捕获浏览器上发生的事件(比如用户点击了盒子)

Nginx 转发 socket 端口配置

Nginx 转发 socket 端口常见场景:在线学习应用,在常规功能之外,增加一个聊天室功能,后端选择 swoole 提供服务提供者,同时不想前端直接 ip:port 方式链接到服务,需要使用 Nginx 进行转发。

websocket.io

服务器端:使用express服务;简单的使用websocket.io;使用命名空间 实例中两个命名空间info job;客户端 vue为例引入socket.io-client

Socket通信原理.一文了解Socket

Socket 的中文翻译过来就是“套接字”。套接字是什么,我们先来看看它的英文含义:插座。Socket 就像一个电话插座,负责连通两端的电话,进行点对点通信,让电话可以进行通信,端口就像插座上的孔,端口不能同时被其他进程占用。而我们建立连接就像把插头插在这个插座上

Vue.js 如何使用 Socket.IO

Socket.IO是一个WebSocket库,可以在浏览器和服务器之间实现实时,双向和基于事件的通信。它包括:Node.js服务器库、浏览器的Javascript客户端库。它会自动根据浏览器从WebSocket、AJAX长轮询、

轮询、长轮询、长连接、socket连接、WebSocket

轮询:客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接;长轮询:客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接

封装小程序的websocket

这两天的工作中,我重构了一个项目里的客服聊天功能,是小程序的,用了小程序提供的websocket有关的接口,我感觉很简单,和web端的接口大体一致,不过我喜欢封装后去使用,封装成一个类,创建一个类的实例

使用Promise封装Websocket

await 后面若是跟的Promise,则接受Promise resolve的值。Promise reject的值需要try...catch住,或者await 后面的表达式跟着.catch()

socket.io的接入使用

传统的客户端和服务器通信协议是HTTP:客户端发起请求,服务端进行响应,服务端从不主动勾搭客户端。这种模式有个明显软肋,就是同步状态。而实际应用中有大量需要客户端和服务器实时同步状态的场景

如何在 React 中正确的使用 socket.io 客户端?

最近在一个 React 项目中,使用到了 socket.io 处理即时消息,这里面有几点容易被忽视的问题,例如:在 React 单页面应用中如何防止出现多个 socket 实例、在任意的的组件内如何方便的取到 socket 实例

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!