1 回答

TA貢獻(xiàn)1834條經(jīng)驗(yàn) 獲得超8個(gè)贊
問(wèn)題在于解碼器緩沖來(lái)自基礎(chǔ)讀取器的數(shù)據(jù),并且緩沖數(shù)據(jù)可以包含來(lái)自流中稍后消息的數(shù)據(jù)。當(dāng)應(yīng)用程序丟棄解碼器時(shí),將丟棄緩沖的數(shù)據(jù)。稍后的解碼器返回錯(cuò)誤,因?yàn)樗谧x取不完整的消息。
有一個(gè)簡(jiǎn)單的方法來(lái)解決這個(gè)問(wèn)題。gob 包旨在讀取和寫(xiě)入值流。在循環(huán)外部創(chuàng)建編碼器和解碼器,并讓包處理消息成幀。
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)
}
如果由于某種原因必須在循環(huán)內(nèi)創(chuàng)建編碼器和解碼器,則應(yīng)用程序必須實(shí)現(xiàn)消息成幀,以防止解碼器讀取多個(gè)值。構(gòu)建消息的一種方法是讓客戶端在 gob 編碼值之前寫(xiě)入長(zhǎng)度前綴。服務(wù)器讀取長(zhǎng)度,然后將解碼器限制為讀取該字節(jié)數(shù)。
- 1 回答
- 0 關(guān)注
- 153 瀏覽
添加回答
舉報(bào)