1 回答

TA貢獻2037條經驗 獲得超6個贊
應用程序在循環的每次迭代中創建并丟棄一個緩沖區。丟棄的緩沖區可以包含從連接中讀取的未處理數據。
通過在循環之外創建 bufio.Reader 來修復。
該表達式的[]byte(`\n`)[0]計算結果為 byte \,而不是\n。通過指定\n為分隔符進行修復。
br := bufio.NewReader(peer.conn)
for {
//will listen for message to process ending in newline (\n)
msg, msgErr := br.ReadBytes('\n')
...
客戶端將消息終止符寫為兩個字節\, n。\n通過使用解釋的字符串文字而不是原始字符串文字,將客戶端更改為寫入單個字節。
peer.conn.Write([]byte("\n"))
如果您可以刪除使用換行符分隔的十六進制編碼消息的要求,那么您可以直接使用 gob 解碼器:
func Listen(peer Peer) {
defer peer.conn.Close()
log.Info("?? Listening for messages from: ", peer.Address)
dec := gob.NewDecoder(peer.conn)
for {
var networkMessage NetworkMessage
err := dec.Decode(&networkMessage)
if err != nil {
log.Info("decode error:", err)
return
}
// do something with networkMessage
}
}
對客戶端代碼進行相應的更改。添加字段并將字段初始化enc *gob.Encoder為. 在 SendMsgToPeer 中使用編碼器。Peergob.NewEncoder(peer.conn)
func SendMsgToPeer(networkMessage NetworkMessage, peer Peer) {
log.Debug("?? Message Sent -> Peer: ", peer.Address,
" Command: ", string(networkMessage.Command),
" Payload: ", string(utils.TruncateString(networkMessage.Payload, 50)))
err := peer.enc.Encode(networkMessage)
if err != nil {
log.Warn("? Error encoding message.")
}
}
- 1 回答
- 0 關注
- 219 瀏覽
添加回答
舉報