最近在写一个即时通讯应用,需要用到websocket,用的库是github.com/gofiber/contrib/websocket
,简单封装的fasthttp.websocket
,然后发现websocket.Conn.Close()
不能关闭连接,客户端还可以发信息
因为没有这个API不是关闭ws连接的,因该手动发送关闭消息
gofunc (s *Session) Close() error {
if s.Ws == nil {
return errors.New("WebSocket connection is nil")
}
// 发送 WebSocket 关闭消息
deadline := time.Now().Add(time.Minute)
err := s.Ws.WriteControl(
websocket.CloseMessage,
websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""),
deadline,
)
if err != nil {
return err
}
// 设置读取下一条消息的截止时间
err = s.Ws.SetReadDeadline(time.Now().Add(5 * time.Second))
if err != nil {
return err
}
// 读取消息,直到确认关闭消息
for {
_, _, err = s.Ws.NextReader()
if websocket.IsCloseError(err, websocket.CloseNormalClosure) {
break
}
if err != nil {
break
}
}
// 关闭 TCP 连接
err = s.Ws.Close()
if err != nil {
return err
}
s.Ws = nil // 将连接置为 nil,避免重复关闭
return nil
}
本文作者:yowayimono
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!