2 回答

TA貢獻1963條經驗 獲得超6個贊
鑒于客戶端發送多行,服務器應該讀取多行。使用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)
? ?}
}
關于代碼的一些注釋:
為了防止資源泄漏,該函數在返回時關閉連接。
掃描儀循環因讀取連接錯誤而中斷。如果錯誤不是 io.EOF,則該函數會記錄該錯誤。
bufio.Reader也可以用來讀取行,但是 bufio.Scanner 更容易使用。

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