第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Gorilla websocket 錯誤:關(guān)閉 1007 非法 UTF-8 序列

Gorilla websocket 錯誤:關(guān)閉 1007 非法 UTF-8 序列

Go
蕪湖不蕪 2021-10-18 17:23:23
我正在嘗試為 GlassFish 實現(xiàn)一個 websocket 代理服務(wù)器。如果我嘗試連接多個客戶端,則會出現(xiàn)錯誤:ReadMessage 失?。簑ebsocket:關(guān)閉 1007 非法 UTF-8 序列。我確信 GlassFish 服務(wù)器發(fā)送了正確的數(shù)據(jù),因為同一臺服務(wù)器與另一個使用 node.js 實現(xiàn)的代理服務(wù)器一起正常工作。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)            }        }    }}
查看完整描述

1 回答

?
慕虎7371278

TA貢獻1802條經(jīng)驗 獲得超4個贊

總結(jié)我的評論作為答案:


當(dāng)您寫入客戶端時,您從 GlassFish 消息中獲取 clientId,從地圖中獲取客戶端,然后寫入它 - 基本上是clients[clientId].WriteMessage(...)。


雖然您的地圖訪問可以是線程安全的,但寫入不是,因為這可以被視為:


// map access - can be safe if you're using a concurrent map

client := clients[clientId]


// writing to a client, not protected at all

client.WriteMessage(...)

所以可能發(fā)生的事情是兩個單獨的 goroutine 同時寫入同一個客戶端。您應(yīng)該通過在WriteMessage方法實現(xiàn)中添加互斥鎖來保護您的客戶端免受它的影響。


順便說一句,實際上不是使用互斥鎖來保護此方法,而是使用一個通道來編寫消息,并且每個客戶端使用一個 goroutine 從通道中消費并寫入實際套接字,而不是使用互斥鎖來保護此方法。


所以在客戶端結(jié)構(gòu)中我會做這樣的事情:


type message struct {

   msgtype string

   msg string

 }


type client struct {

    ...

    msgqueue chan *message

}



func (c *client)WriteMessage(messageType, messageText string) {

   // I'm simplifying here, but you get the idea

   c.msgqueue <- &message{msgtype: messageType, msg: messageText}

}


func (c *client)writeLoop() {

   go func() {

       for msg := ragne c.msgqueue {

           c.actuallyWriteMessage(msg)

       }

   }()

}

并且在創(chuàng)建新的客戶端實例時,只需啟動寫入循環(huán)


查看完整回答
反對 回復(fù) 2021-10-18
  • 1 回答
  • 0 關(guān)注
  • 419 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號