1 回答
![?](http://img1.sycdn.imooc.com/545861f00001be3402200220-100-100.jpg)
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 关注
- 188 浏览
添加回答
举报