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

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

使用 GOB 進行連續編碼/解碼

使用 GOB 進行連續編碼/解碼

Go
開滿天機 2022-08-15 19:19:51
我是編程Golang Sockets的新手。當我嘗試將一條消息從客戶端發送到服務器時,它工作正常。但是,當我嘗試發送連續10條消息時,我收到錯誤。要搜索的任何線索/關鍵字。請找到隨附的示例代碼。Server.gopackage mainimport (    "encoding/gob"    "fmt"    "net"    "os")func main() {    tcpAddr, err := net.ResolveTCPAddr("tcp4", ":5555")    checkError("ResolveTCPAddr", err)    listener, err := net.ListenTCP("tcp", tcpAddr)    checkError("ListenTCP", err)    conn, err := listener.Accept()    checkError("Accept", err)    for i := 0; i < 10; i++ {        var s string        dec := gob.NewDecoder(conn)        err = dec.Decode(&s)        checkError("Decode", err)        fmt.Println(s)    }}func checkError(info string, err error) {    if err != nil {        fmt.Fprintf(os.Stderr, info+": Run - Fatal error: %s\n", err.Error())        os.Exit(1)    }}客戶端package mainimport (    "encoding/gob"    "fmt"    "net"    "os")func main() {    tcpAddr, err := net.ResolveTCPAddr("tcp4", ":5555")    checkError("ResolveTCPAddr", err)    conn, err := net.DialTCP("tcp", nil, tcpAddr)    checkError("DialTCP", err)    for i := 0; i < 10; i++ {        enc := gob.NewEncoder(conn)        err = enc.Encode("test")        checkError("Encode", err)    }}func checkError(info string, err error) {    if err != nil {        fmt.Fprintf(os.Stderr, info+": Run - Fatal error: %s\n", err.Error())        os.Exit(1)    }}屏幕:testtesttesttesttestDecode: Run - Fatal error: EOFexit status 1
查看完整描述

1 回答

?
MMMHUHU

TA貢獻1834條經驗 獲得超8個贊

問題在于解碼器緩沖來自基礎讀取器的數據,并且緩沖數據可以包含來自流中稍后消息的數據。當應用程序丟棄解碼器時,將丟棄緩沖的數據。稍后的解碼器返回錯誤,因為它正在讀取不完整的消息。


有一個簡單的方法來解決這個問題。gob 包旨在讀取和寫入值流。在循環外部創建編碼器和解碼器,并讓包處理消息成幀。


enc := gob.NewEncoder(conn)

for i := 0; i < 10; i++ {

    err = enc.Encode("test")

    checkError("Encode", err)

}



dec := gob.NewDecoder(conn)

for i := 0; i < 10; i++ {

    var s string

    err = dec.Decode(&s)

    checkError("Decode", err)

    fmt.Println(s)

}

如果由于某種原因必須在循環內創建編碼器和解碼器,則應用程序必須實現消息成幀,以防止解碼器讀取多個值。構建消息的一種方法是讓客戶端在 gob 編碼值之前寫入長度前綴。服務器讀取長度,然后將解碼器限制為讀取該字節數。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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