繁体   English   中英

进入bufio.Scanner在读取与Redis的TCP连接时停止

[英]Go bufio.Scanner stops while reading TCP connection to Redis

使用bufio.Scanner读取Redis服务器之间的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 )?

发送命令后,Redis不会为您关闭连接。 扫描()在未发送的io.EOF之后结束。

看看这个:

package main

import (
    "bufio"
    "fmt"
    "net"
)

// before go run, you must hit `redis-server` to wake redis up
func main() {
    conn, _ := net.Dial("tcp", "localhost:6379")
    message := "*3\r\n$3\r\nSET\r\n$1\r\na\r\n$1\r\nb\r\n"

    go func(conn net.Conn) {
        for i := 0; i < 10; i++ {
            fmt.Fprintf(conn, message)
        }
    }(conn)

    scanner := bufio.NewScanner(conn)
    for {
        if ok := scanner.Scan(); !ok {
            break
        }
        fmt.Println(scanner.Text())
    }
    fmt.Println("Scanning ended")
}

老问题,但我有同样的问题。 两种解决方案:

1)在您的Redis消息中添加“ QUIT \\ r \\ n”命令。 这将导致Redis关闭连接,这将终止扫描。 您将不得不处理退出输出的额外“ + OK”。

2)添加

conn.SetReadDeadline(time.Now().Add(time.Second*5))

在您开始扫描之前。 这将导致扫描在5秒钟后停止尝试。 不幸的是,完成扫描总是需要5秒钟,因此请明智地选择此时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM