为什么它在超时时直接关闭连接而不是调用closeHandler方法?

时间:2018-05-15 12:57:19

标签: go websocket

为什么在超时时直接关闭连接而不是调用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"

package:" github.com/gorilla/websocket"

1 个答案:

答案 0 :(得分:3)

websocket RFC说明了状态1006:

  

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

websocket package documention说:

  

SetCloseHandler设置从对等方接收的关闭消息的处理程序

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

包文档还说:

  

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

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

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