我天真地使用_,错误:= ws.Read(msg)来保持我的代码中的Web套接字打开.我觉得它不可靠.
在其他代码中,我注意到人们正在进行睡眠循环.保持Web套接字开放和稳定的正确方法是什么?我假设底层库执行ping/pongs?
更新:我非常有信心client.go应该责备,因为在服务器上看到断开连接后似乎没有重拨.我制作了一个视频来展示这个问题.
golang.org/x/net/websocket没有实现RFC 6455的乒乓,但是gorilla websocket 实现了.Gorilla websocket的最小例子
c := time.Tick(pingInterval)
go func(){
for _ := range c {
if err := conn.WriteControl(Ping...); err != nil {
handle error
}
}
}()
-----
conn.SetPongHandler(func(string) error { return conn.SetReadDeadline(time.Now().Add(pingInterval)) })
go func(){
for {
if _, _, err := conn.NextReader(); err != nil {
handle error
}
}
}()
Run Code Online (Sandbox Code Playgroud)
我误读了你原来的问题.
不,你马上就做了.您基本上需要阻止处理程序返回以保持websocket连接活动.如果您不关心该消息,请丢弃它并对其执行任何操作.
一种常见的方式人们做的是有一个专门的Read和Write够程,是这样的:
func fishHandler(ws *websocket.Conn) {
id := ws.RemoteAddr().String() + "-" + ws.Request().RemoteAddr + "-" + ws.Request().UserAgent()
sockets[id] = ws
go writePump(ws)
readPump(ws)
}
func readPump(ws *websocket.Conn) {
defer ws.Close()
msg := make([]byte, 512)
_, err := ws.Read(msg)
if err != nil {
return
}
}
func writePump(ws *websocket.Conn) {
// Hand the write messages here
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2630 次 |
| 最近记录: |