【发布时间】:2015-07-09 08:45:25
【问题描述】:
我正在尝试为 GlassFish 实现一个 websocket 代理服务器。如果我尝试连接多个客户端,则会出现错误:
ReadMessage 失败:websocket: close 1007 Illegal UTF-8 Sequence。
我确信 GlassFish 服务器发送了正确的数据,因为同一台服务器可以与另一个使用 node.js 实现的代理服务器正常工作。
func GlassFishHandler(conn *websocket.Conn){
defer conn.Close()
conn.SetReadDeadline(time.Now().Add(1000 * time.Second))
conn.SetWriteDeadline(time.Now().Add(1000 * time.Second))
fmt.Println("WS-GOLANG PROXY SERVER: Connected to GlassFish")
for {
messageType, reader, err := conn.NextReader()
if err != nil {
fmt.Println("ReadMessage Failed: ", err) // <- error here
} else {
message, err := ioutil.ReadAll(reader)
if (err == nil && messageType == websocket.TextMessage){
var dat map[string]interface{}
if err := json.Unmarshal(message, &dat); err != nil {
panic(err)
}
// get client destination id
clientId := dat["target"].(string)
fmt.Println("Msg from GlassFish for Client: ", dat);
// pass through
clients[clientId].WriteMessage(websocket.TextMessage, message)
}
}
}
}
【问题讨论】:
-
您是否在客户端或代理中收到错误?无论如何,websockets 要求发送的数据是正确的 utf-8。如果
message不是有效的 utf-8,则至少在客户端会失败。尝试将消息转义或转换为 utf-8,看看是否仍然会发生这种情况。 -
我的代理出现错误。此外,我很确定消息是有效的 utf-8。这只是一个带有随机字符串的简短测试 json 数据 [A-Z0-9]
-
那么我觉得可疑的是
clients[clientId].WriteMessage(...)。可能有两个单独的 goroutine 同时向同一个客户端写入数据(也许我们以某种方式为两个客户端 ID 建立了一个连接?您的代码没有提供足够的上下文)。这不是线程安全的,并且会导致写入损坏的数据,从而导致此错误。 -
我正在使用并发映射,我只是想保持示例简单。
-
您可能正在使用并发映射,但是两个 goroutine 仍然可以同时写入,即使它们没有同时访问映射。
标签: go websocket glassfish gorilla