如何在GO中存储websocket连接

时间:2014-05-12 11:30:13

标签: websocket go

我想将客户端websocket连接存储到wsList,并以统一方式发送响应。但它将返回“使用封闭网络连接”。怎么解决?

import {
    "code.google.com/p/go.net/websocket" 
    ...
}

var wsList []*websocket.Conn

func WShandler(ws *websocket.Conn) {
    wsList = append(wsList, ws)
    go sendmsg()
}

func sendmsg() {
    for _, conn := range wsList {
        if err := websocket.JSON.Send(conn, outmsg); err != nil {
            fmt.Printf("%s", err)   //"use of closed network connection"
        }
    }
}

2 个答案:

答案 0 :(得分:3)

ws返回时,关联WsHandler已关闭。要解决此问题,请通过循环读取消息来阻止WsHandler返回,直到检测到错误:

func WShandler(ws *websocket.Conn) {
  wsList = append(wsList, ws)
  go sendmsg()
  for {
     var s string
     if err := websocket.Message.Receive(ws, &s); err != nil {
        break
     }
  }
  // remove ws from wsList here
}

wsList上有一场比赛。用互斥锁保护它。

答案 1 :(得分:2)

您不能简单地假设所有连接都无限期保持打开状态,因为另一端可能会随意关闭它们,或者可能会发生网络中断,从而迫使它们关闭。

当您尝试读取或写入已关闭的连接时,会出现错误

"use of closed network connection"

您应该放弃已关闭的连接。