首页 > 解决方案 > 为什么超时直接关闭连接而不是调用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”

标签: gowebsocket

解决方案


websocket RFC对状态 1006 这么说:

1006 是保留值,绝不能在端点关闭控制帧中设置为状态码。它被指定用于期望状态代码指示连接已异常关闭的应用程序,例如,没有发送或接收关闭控制帧。

websocket 包文档说:

SetCloseHandler 为从对端接收到的关闭消息设置处理程序

由于未收到关闭消息,因此未调用关闭处理程序。对等方关闭连接而不发送关闭消息。

包文档还说:

当收到关闭消息时,连接读取方法返回 CloseError。大多数应用程序应将关闭消息作为其正常错误处理的一部分来处理。只有当应用程序必须在将关闭消息发送回对等方之前执行某些操作时,应用程序才应设置关闭处理程序。

因为问题中的处理程序不发送关闭消息或采取任何其他操作,所以不需要问题中的关闭处理程序。处理程序是有害的,因为它不回显关闭消息。

删除关闭处理程序并处理关闭消息作为应用程序正常错误处理的一部分。


推荐阅读