我正在尝试通过以下方式从网络连接读取数据:
func getIn(conn net.Conn){
for{
in, err := bufio.NewReader(conn).ReadString('\n')
if err!=nil{
fmt.Printf(err.Error())
}
fmt.Printf("[%s]", in)
}
}
发送到该连接的输入流具有以下模式:
消息1\n 消息2\n 消息3\n 消息4\n 消息5\n
etc...
我注意到我的函数会跳过消息,输出例如:
消息1\n消息2\n消息4\n 消息5\n
这让我认为每次遇到换行符时 bufio ReadString 方法都会丢弃传入的缓冲区。假设缓冲区由以下部分组成:
消息1\n混乱
在阅读的那一刻。然后,message1被读取,其余部分mess被丢弃。这也不完全有意义,因为那么下一个输入应该是age2,但实际上是message3.
我使用了另一个函数 net.Conn.Read(),它确实不会跳过输入的任何部分,但需要我进行更多的字符串解析。如何让 ReadString() 函数为我工作?
ReadString()
不丢弃数据,它仍然是buffered in bufio.Reader
对象,即:
conn := bytes.NewBufferString("message1\n message2\n message3\n ")
reader := bufio.NewReader(conn)
in, _ := reader.ReadString('\n') // "message1\n"
fmt.Println(strconv.Quote(in))
in, _ = reader.ReadString('\n') // "message2\n"
fmt.Println(strconv.Quote(in))
fmt.Println(strconv.Quote(conn.String())) // ""
请注意,尽管所有数据均已从conn
缓冲区,仍然可以通过后续访问reader.ReadString()
称呼。但是,您在每次迭代时都会丢弃读取器对象,并且所有数据都会丢失。
您应该在循环外创建缓冲读取器,这样您的读取器仍然位于第二个循环中:
reader := bufio.NewReader(conn)
for {
in, err := reader.ReadString('\n')
...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)