請幫助我了解觀察到的從套接字讀取的行為。
在實驗中,發送方總是發送相同的行,以 '\n' 結尾,然后關閉套接字的寫入端。
接收端的此代碼按預期作業,列印每一行:
rdr := bufio.NewReader(sock)
for {
b, err := rdr.ReadBytes('\n')
if err != nil {
break
}
fmt.Print(string(b))
}
然而,這段代碼
n, err := io.Copy(os.Stdout, sock)
有時會從資料塊的開頭跳過亂數量的行,并且只列印其余的行(n相應地更改,并且err始終為零)。
Thesock是一種自定義型別,它抽象了net.TCPConn和tls.Conn,否則將在整個代碼庫中使用,而不會出現問題。
為什么 read by 開頭的行io.Copy有時會丟失?
uj5u.com熱心網友回復:
bufio.Reader實作io.Reader物件的緩沖。這是什么意思?如果您使用 abufio.Reader從io.Reader源讀取資料,它可能會從其源(并緩沖它)讀取比您直接從其bufio.Reader本身讀取的資料更多的資料。
這意味著如果您使用 abufio.Reader從sock第一個讀取,然后使用io.Copy(),可能有一些資料已經讀取sock并位于bufio.Reader的內部緩沖區中,這些資料io.Copy()將看不到也不會復制。
你不應該在同一個io.Reader來源上混合這兩個。如果必須,請務必先排空bufio.Reader's 緩沖區,然后像這樣繼續復制sock:
// First drain the buffer:
n, err := io.Copy(os.Stdout, rdr)
// Handle error
// Then proceed with the socket:
n, err = io.Copy(os.Stdout, sock)
// Handle error
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/416592.html
標籤:
