我正在關(guān)注大猩猩提供的聊天示例。我仍然可以解組發(fā)送的 json 數(shù)據(jù)。我應(yīng)該在readPump():func (c *ChatClient) readPump() { defer func() { c.hub.unregisterChan <- c c.conn.Close() }() c.conn.SetReadLimit(maxMessageSize) c.conn.SetReadDeadline(time.Now().Add(pongWait)) c.conn.SetPongHandler(func(string) error { c.conn.SetReadDeadline(time.Now().Add(pongWait)); return nil }) for { _, message, err := c.conn.ReadMessage() // =================MY CODE START============= var comment Comment err = c.conn.ReadJSON(comment) if err != nil { LogErr("readjson()", err) break } err = json.Unmarshal(message, comment) if err != nil { LogErr("readjson()", err) break } // =================MY CODE END============= if err != nil { if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure) { LogErr("IsUnexpectedCloseError()", err) } break } message = bytes.TrimSpace(bytes.Replace(message, newline, space, -1)) c.hub.broadcastChan <- message }}或在writePump()func (c *ChatClient) writePump() { ticker := time.NewTicker(pingPeriod) defer func() { ticker.Stop() c.conn.Close() }() for { select { case message, ok := <-c.send: c.conn.SetWriteDeadline(time.Now().Add(writeWait)) // CLOSE if !ok { c.conn.WriteMessage(websocket.CloseMessage, []byte{}) return } w, err := c.conn.NextWriter(websocket.BinaryMessage) if err != nil { LogErr("c.conn.NextWriter", err) return }LogErr() 方法不打印任何消息。完全迷失在這里。
1 回答
慕尼黑5688855
TA貢獻1848條經(jīng)驗 獲得超2個贊
應(yīng)用程序通過循環(huán)在每次迭代中讀取兩條消息,并嘗試將這兩條消息解組為comment. 只讀一條消息。
應(yīng)用程序調(diào)用ReadJSON不Unmarshal正確,從這些函數(shù)返回的錯誤解釋了原因:應(yīng)用程序試圖解組為非指針。
應(yīng)用程序還將消息的原始字節(jié)發(fā)送到通道。看起來它可能是您正在復(fù)制的任何內(nèi)容的剩余部分,因此我將在答案的其余部分忽略它。
這是固定循環(huán):
for {
var comment Comment
err = c.conn.ReadJSON(&comment)
if err != nil {
if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure) {
LogErr("IsUnexpectedCloseError()", err)
}
break
}
// Do something with comment
}
- 1 回答
- 0 關(guān)注
- 185 瀏覽
添加回答
舉報
0/150
提交
取消
