1 回答
TA贡献1802条经验 获得超5个赞
Websocket 服务器应用程序必须通过关闭连接并释放与该连接关联的资源来处理连接上的错误。
当包含的页面刷新时,浏览器会关闭 websocket 连接。浏览器关闭连接后,服务器最终会收到读取或写入错误。
连接关闭是服务器可能遇到的几种错误之一。服务器应用程序应以相同的方式处理连接上的所有错误:关闭连接并释放与该连接关联的资源。
典型的应用程序设计是让客户端在页面加载时进行连接,并在发生错误后重新连接(使用退避)。服务器假设客户端会随着时间的推移而连接和断开连接。
可以通过添加一个通过退避重新连接的 onerror 处理程序来改进 JS 代码。根据应用程序的不同,您可能还希望显示指示连接状态的 UI。
Go代码并不会在所有场景下关闭连接。正在运行的命令是与连接关联的资源。应用程序不会在连接错误时终止该程序。以下是一些修复:
defer ws.Close()升级成功后添加。ws.Close()删除对from的其他直接调用SocketHandler.ServeHTTP。这确保了ws.Close()在所有场景中都被调用。
从读写泵退出时终止该命令。命令启动后将读取泵移至。回来就杀掉。
go func(c *websocket.Conn, cmd *exec.Command) {
defer c.Close()
defer cmd.Process.Kill()
for {
if _, _, err := c.NextReader(); err != nil {
break
}
}
}(ws, cmd)
从写泵退出时终止命令:
s := bufio.NewScanner(io.MultiReader(stdout, stderr))
for s.Scan() {
err := ws.WriteMessage(1, s.Bytes())
if err != nil {
break
}
}
cmd.Process.Kill()
我还没有运行或测试过这段代码。有些细节可能是错误的,但这概述了关闭连接和释放资源的一般方法。
- 1 回答
- 0 关注
- 147 浏览
添加回答
举报