服务器正确关闭websocket连接



TryCloseNormally函数从服务器端关闭websocket连接。此函数有两个版本。第一个只是发送了一个关闭请求。第二个是等待响应——来自客户端的副本。以下哪项功能是正确的?

版本1

func TryCloseNormally(wsConn *websocket.Conn) error {
closeNormalClosure := websocket.FormatCloseMessage(websocket.CloseNormalClosure, "")
if err := wsConn.WriteControl(websocket.CloseMessage, closeNormalClosure, time.Now().Add(time.Second)); err != nil {
return err
}
return wsConn.Close()
}

版本2

// The function tries to close the connection according to the RFC 6455 standard.
// The function ALWAYS closes the connection.
//
// To handle the case where the peer sent a data message before the sending the close message,
// function read and discard data messages until an Normalclose is returned.
func TryCloseNormally(wsConn *websocket.Conn, closeCode int, textErr string) error {
defer wsConn.Close()
closeNormalClosure := websocket.FormatCloseMessage(closeCode, textErr)
if err := wsConn.WriteControl(websocket.CloseMessage, closeNormalClosure, time.Now().Add(time.Second)); err != nil {
return err
}
if err := wsConn.SetReadDeadline(time.Now().Add(time.Second)); err != nil {
return err
}
for {
_, _, err := wsConn.ReadMessage()
if websocket.IsCloseError(err, closeCode) {
return nil
}
if err != nil {
return err
}
}
}

我需要等待客户的回复吗?或者它不会影响任何事情。

两者都是正确的。

第二个函数实现闭合握手。握手使服务器可以读取客户端发送的所有消息。

如果可以丢弃客户端发送的消息,请使用第一个函数。

最新更新