【发布时间】:2014-08-24 06:44:54
【问题描述】:
使用bufio.Scanner读取Redis-server之间的TCP连接
fmt.Fprintf(conn, "*3\r\n$3\r\nSET\r\n$5\r\nmykey\r\n$7\r\nHello!!\r\n")
scanner := bufio.NewScanner(conn)
for {
// fmt.Println("marker00")
if ok := scanner.Scan(); !ok {
// fmt.Println("marker01")
break
}
// fmt.Println("marker02")
fmt.Println(scanner.Text())
}
"+OK" 是第一次扫描的结果,但第二次扫描在调用Scan 方法时停止。 (marker00 -> marker02 -> marker00 不再有输出)
为什么Scan 会停止,我如何知道 TCP 响应结束(不使用 bufio.Reader)?
【问题讨论】:
-
它确实适用于一个简单的字符串 (play.golang.org/p/Z3oMRi5A0g),所以它应该在这里指出第一个
Scan()的输出不知何故得到了conn的全部内容。你试过scanner := bufio.NewScanner(bufio.NewReader(conn))吗? -
@VonC 感谢您的评论!是的,我尝试了 NewReader 的 NewScanner。在这种情况下,conn 响应的全部内容将只有“+OK”。 (@见pbs.twimg.com/media/BvyUw1ECQAE3vaQ.jpg)
-
您设法获得的唯一
scanner.Text()的第一个输出是什么? -
它是“+OK”,我想要足够的响应,但问题是它永远不会结束。 (我做了一个要点来重现这个问题gist.github.com/otiai10/3cf030e2f7816a59347f如果你不介意检查)
-
你期待什么? Redis 在发送命令后不会为您关闭连接。 Scan() 在未发送的 io.EOF 之后结束。