【问题标题】:how do you read all the bytes that come on a tcp connection?您如何读取 tcp 连接上的所有字节?
【发布时间】:2012-09-18 05:46:14
【问题描述】:

在你建立一个连接之后,你想读取来自连接的字节,你怎么能读取所有的字节呢?根据我的尝试,我可以阅读直到它到达一个分隔符,比如换行符。但是如何获得包括换行符在内的所有内容?我正在尝试在 Go 中创建一个 redis 客户端,并且协议用 \r\n 分隔结果,所以在这种情况下 Buffer.ReadLine 或 Buffer.ReadSlice 没有帮助。

【问题讨论】:

    标签: tcp redis go


    【解决方案1】:

    要从 Reader 读取所有字节(例如您的 TCP 连接),您可以使用 ioutil.ReadAll,它会一直读取直到从另一端发送 EOF 或发生错误。

    请注意,已经有一些 redis clients 可供使用。

    【讨论】:

    • 仅供参考:官方推荐的 Go Redis 客户端是 Redigo,根据 redis.io/clients(见 ★)。
    • 谢谢,我更新了我的答案,指向那个客户列表。
    • @nemo 我很好奇,在与 redis 服务器通信时,如何正确读取 EOF?只要符合协议,redis-server 就可以发送任何字节流。 redis-server 只能响应 redis 协议定义的 5 种不同数据类型中的任何一种。我只是感到困惑,发送 EOF 是不是协议规范的一部分。因此,阅读到 EOF 对我来说似乎没有意义,因为它可能永远不会被发送。
    • 我觉得正确的做法是,如果你知道你期望什么类型的响应(因为你知道你正在发送什么命令,因为你是redis客户端向redis发送命令),那么正确的做法是,阅读直到您期望的响应结束。对于 RESP 简单字符串、错误和整数,在达到 \r\n 时停止从连接中读取。在批量字符串或 RESP 数组的情况下,继续阅读,直到前缀长度(即类型长度值方案)说停止阅读。我认为这是正确的做法。
    • 当然,除非你能说服我,否则你的解决方案是正确的。
    猜你喜欢
    • 1970-01-01
    • 2019-04-05
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    • 2014-04-23
    • 1970-01-01
    相关资源
    最近更新 更多