Websocket
Websockets
WebSocket 是一个通过 TCP 连接启用双向持久通信信道的协议。它可以用于聊天,股票行情以及游戏的应用场景中,任何你想使用实时功能的Web 应用程序中。
什么时候使用 Websocket
当你需要使用直接使用套接字编程时,你可以使用 Websockets 实现。例如,对于实时的游戏,你可能需要最好的性能。
怎么使用 Websocket
- 导入
"github.com/kataras/iris/websocket"
包 - 对 WebSocket 包进行配置
- 接受 Websocket 的请求
- 发送和接收消息
导入 websocket 包
import "github.com/kataras/iris/websocket"
对 Websocket 包进行配置
import "github.com/kataras/iris/websocket"
func main() {
ws := websocket.New(websocket.Config{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
})
}
完整的配置
// 配置 websocket 服务的配置
// 所有的配置都是可选的
type Config struct {
// IDGenerator 用来创建(以及稍后设置)
// 每一个传入 websocket 的链接(客户端)的ID
// request 请求是一个参数,这个参数你可以用来生成 ID(例如,来自 headers)
// 如果为空,则 ID 由DefaultGenerator 生成:
IDGenerator func(ctx context.Context) string
Error func(w http.ResponseWriter, r *http.Request, status int, reason error)
CheckOrigin func(r *http.Request) bool
// HandshakeTimeout 指定握手完成的持续时间。
HandshakeTimeout time.Duration
// WriteTimeout time 是允许向连接里面写入信息的时间
// 0 表示永远不超时
// 默认值是 0
WriteTimeout time.Duration
// ReadTimeout time 是允许从连接里面读取信息的时间
// 0 表示永远不超时
// 默认值是 0
ReadTimeout time.Duration
// PongTimeout允许从连接中读取下一个pong消息的时间
// 默认值时 60 * time.Second
PongTimeout time.Duration
// PingPeriod将ping消息发送到此期间的连接。 必须小于PongTimeout。
// 默认值时 60 * time.Second
PingPeriod time.Duration
// MaxMessageSize 是允许一个 websocket 连接里消息的最大字节
// 默认值时 1024
MaxMessageSize int64
// inaryMessages 将其设置为 true,以表示二进制数据消息而不是utf-8文本
//兼容,如果您想使用 websockey 连接的 EmitMessage 将自定义二进制数据发送到客户端,如本机服务器 - 客户端通信
// 默认是 false
BinaryMessages bool
// ReadBufferSize 是下划线阅读器的缓冲区大小
// 默认值是 4096
ReadBufferSize int
// WriteBufferSize是下划线编写器的缓冲区大小
// 默认值是 4096
WriteBufferSize int
// EnableCompression 指定服务器是否应尝试协商每个消息压缩(RFC 7692)。
// 将此值设置为 true 并不能保证将支持压缩。
// 目前仅支持“无上下文接管”模式
EnableCompression bool
// 子协议按优先顺序指定服务器支持的协议。
// 如果设置了此字段,则Upgrade方法通过使用客户端请求的协议选
// 择此列表中的第一个匹配来协商子协议。
Subprotocols []string
}
接受 WebSocket 的请求 & 发送消息 & 接收消息
import (
"github.com/kataras/iris"
"github.com/kataras/iris/websocket"
)
func main() {
ws := websocket.New(websocket.Config{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
})
ws.OnConnection(handleConnection)
app := iris.New()
// 在端点上注册一个服务.
// 请参阅 websockets.html 中的内联 JavaScrip t代码,此端点用于连接到服务器。
app.Get("/echo", ws.Handler())
// 提供内置客户端库的 javascript,
//请参阅 weboskcets.html 脚本标记,使用此路径。
app.Any("/iris-ws.js", func(ctx iris.Context) {
ctx.Write(websocket.ClientSource)
})
}
func handleConnection(c websocket.Connection) {
// 从浏览器中读取事件
c.On("chat", func(msg string) {
// 将消息打印到控制台,c .Context()是iris的http上下文。
fmt.Printf("%s sent: %s\n", c.Context().RemoteAddr(), msg)
// 将消息写回客户端消息所有者:
// c.Emit("chat", msg)
c.To(websocket.Broadcast).Emit("chat", msg)
})
}
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。