tcp - Go bufio.Scanner 在读取到 Redis 的 TCP 连接时停止

标签 tcp go 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 不会在发送命令后为您关闭连接。 Scan() 在未发送的 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")
}

关于tcp - Go bufio.Scanner 在读取到 Redis 的 TCP 连接时停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25469196/

相关文章:

java - Spring Integration 通过 tcp 连接接收和发送消息

networking - 通过 TCP 代理的 RDP

c - 基于 IP 限制传入的 TCP 连接

php - Golang中是否有相当于PHP的openssl_pkey_get_private?

redis - 为什么一个 500MB 的 Redis dump.rdb 文件需要大约 5.0GB 的内存?

javascript - 无法从使用 spring RedisTemplate 存储的 javascript 中获取 redis 嵌套哈希键值

java - 如何在多宿主配置中控制源 IP

Go 使用 db.Query 返回多列

go - 如何识别一个goroutine?

redis - 使用 ELK stack 时,是否可以直接将数据推送到 Kibana 的数据存储?