2 回答

TA貢獻(xiàn)1963條經(jīng)驗(yàn) 獲得超6個(gè)贊
鑒于客戶端發(fā)送多行,服務(wù)器應(yīng)該讀取多行。使用bufio.Scanner讀取行:
func handleRequest(conn net.Conn) {
? ?defer conn.Close()
? ?scanner := bufio.NewScanner(conn)
? ?for scanner.Scan() {
? ? ? fmt.Printf("Got message: %s\n", scanner.Bytes())
? ? ? conn.Write([]byte("Message received."))
? ?}
? ?if err := scanner.Err(); err != nil {
? ? ? fmt.Printf("error reading connection: %v\n", err)
? ?}
}
關(guān)于代碼的一些注釋:
為了防止資源泄漏,該函數(shù)在返回時(shí)關(guān)閉連接。
掃描儀循環(huán)因讀取連接錯(cuò)誤而中斷。如果錯(cuò)誤不是 io.EOF,則該函數(shù)會(huì)記錄該錯(cuò)誤。
bufio.Reader也可以用來讀取行,但是 bufio.Scanner 更容易使用。

TA貢獻(xiàn)1789條經(jīng)驗(yàn) 獲得超8個(gè)贊
在 中handleRequest()
,您調(diào)用ReadString()
bufio Reader。讓我們看一下文檔:
ReadString 讀取直到輸入中第一次出現(xiàn) delim,返回包含分隔符之前的數(shù)據(jù)的字符串。如果 ReadString 在找到分隔符之前遇到錯(cuò)誤,它將返回錯(cuò)誤之前讀取的數(shù)據(jù)以及錯(cuò)誤本身(通常是 io.EOF)。當(dāng)且僅當(dāng)返回的數(shù)據(jù)不以 delim 結(jié)尾時(shí),ReadString 返回 err != nil。對(duì)于簡(jiǎn)單的使用,掃描儀可能更方便。
考慮到您發(fā)送的數(shù)據(jù)包以 終止,您必須在同一個(gè)讀取器上\n
調(diào)用兩次。ReadString()
您可能希望ReadString()
循環(huán)調(diào)用,直到返回錯(cuò)誤。io.EOF
那么一定要分清楚。
- 2 回答
- 0 關(guān)注
- 194 瀏覽
添加回答
舉報(bào)