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 关注
- 141 浏览
添加回答
举报