我是編程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 編碼值之前寫入長度前綴。服務器讀取長度,然后將解碼器限制為讀取該字節數。
- 1 回答
- 0 關注
- 145 瀏覽
添加回答
舉報
0/150
提交
取消