go - 为什么超时直接关闭连接而不是调用closeHandler方法?
问题描述
为什么超时直接关闭连接而不是调用closeHandler方法?
ws.SetCloseHandler(func(code int, text string) error {
fmt.Println("socket close")
}
// can not get "socket close"
stdout: "websocket: close 1006 (abnormal closure): unexpected EOF"
包:“github.com/gorilla/websocket”
解决方案
websocket RFC对状态 1006 这么说:
1006 是保留值,绝不能在端点关闭控制帧中设置为状态码。它被指定用于期望状态代码指示连接已异常关闭的应用程序,例如,没有发送或接收关闭控制帧。
SetCloseHandler 为从对端接收到的关闭消息设置处理程序
由于未收到关闭消息,因此未调用关闭处理程序。对等方关闭连接而不发送关闭消息。
包文档还说:
当收到关闭消息时,连接读取方法返回 CloseError。大多数应用程序应将关闭消息作为其正常错误处理的一部分来处理。只有当应用程序必须在将关闭消息发送回对等方之前执行某些操作时,应用程序才应设置关闭处理程序。
因为问题中的处理程序不发送关闭消息或采取任何其他操作,所以不需要问题中的关闭处理程序。处理程序是有害的,因为它不回显关闭消息。
删除关闭处理程序并处理关闭消息作为应用程序正常错误处理的一部分。
推荐阅读
- python - python3 - 哪个执行速度更快 - 按顺序弹出还是按列表理解?
- react-native - Expo React Native 项目中的 Android 和 iOS 资产
- python - python中的CloudSim模拟用于创建虚拟机
- flutter - 使用 VsCode 的 Flutter 项目启动问题
- java - 无法使用“Google Play 服务”,请在非 GSM 手机中添加捆绑 MLKit 扫描后尝试允许权限错误
- javascript - 使用无法正常工作的 JavaScript 函数更新数据
- reactjs - 从 reactsJS 中的 iframe 捕获 html2canvas
- python - 使用请求和漂亮的汤访问网页
- python - Selenium chrome 不加载特定网站的图像
- laravel - 获取子类别下的产品数量以及子类别中主要类别的总数