亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

bufio.NewReader ReadBytes - 同時讀取多條消息

bufio.NewReader ReadBytes - 同時讀取多條消息

Go
HUH函數 2022-06-21 15:49:04
我有這個偵聽器函數,它在網絡上偵聽來自其對等方的消息。它必須正常工作,但是當它同時收到兩條消息時,我收到以下錯誤:“?? 消息解碼錯誤 - 緩沖區中有額外數據”這可以修改為同時允許多條消息嗎?func Listen(peer Peer) {    log.Info("?? Listening for messages from: ", peer.Address)    for {        //will listen for message to process ending in newline (\n)        msg, msgErr := bufio.NewReader(peer.conn).ReadBytes([]byte(`\n`)[0])        if msgErr == io.EOF {            peer.conn.Close()        } else if msgErr == nil {            msg, err := hex.DecodeString(string(msg[:len(msg)-1]))            mgsDecoded, decodeErr := DeserializeMessage(msg[:])            if decodeErr == nil {                 // use decoded message here            } else {                log.Warn("?? Message Decode error - ", decodeErr)            }        }    }}//DeserializeMessage - Decode our message from a byte array to//networkMessage *NetworkMessage//over the networkfunc DeserializeMessage(serialized_bytes []byte) (NetworkMessage, error) {    // Create new buffer and decoder    buf := bytes.NewBuffer(serialized_bytes)    enc := gob.NewDecoder(buf)    // Create new Block Instance to load the serialized block into    var networkMessage NetworkMessage    err := enc.Decode(&networkMessage)    return networkMessage, err}添加了我們發送消息的方式:func SendMsgToPeer(networkMessage NetworkMessage, peer Peer) {    log.Debug("?? Message Sent -> Peer: ", peer.Address,        " Command: ", string(networkMessage.Command),        " Payload: ", string(utils.TruncateString(networkMessage.Payload, 50)))    msg, err := networkMessage.SerializeMessage()    if err != nil {        log.Warn("? Error encoding message.")    }    peer.conn.Write([]byte(hex.EncodeToString(msg)))    peer.conn.Write([]byte(`\n`))}
查看完整描述

1 回答

?
阿晨1998

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.")

    }

}


查看完整回答
反對 回復 2022-06-21
  • 1 回答
  • 0 關注
  • 219 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號