gpt4 book ai didi

tcp - 在 golang 中,如何使用 net.TCPConn 在不事先指定字节 slice 长度的情况下进行读取?

转载 作者:IT王子 更新时间:2023-10-29 02:30:22 31 4
gpt4 key购买 nike

我试图从与 redis 客户端(一个正在运行 redis-cli 的终端)的 tcp 连接中读取一些消息。然而,Read net 包的命令要求我提供一个 slice 作为参数。每当我给出一个没有长度的 slice 时,连接就会崩溃并且 go 程序会停止。我不确定我的字节消息之前需要多长。因此,除非我指定一些大得离谱的 slice ,否则此连接将始终关闭,尽管这看起来很浪费。我想知道,是否可以保持连接而不必事先知道消息的长度?我很想解决我的具体问题,但我觉得这个问题更笼统。为什么我需要事先知道长度?图书馆不能给我一片正确大小的 slice 吗?

或者人们建议的其他解决方案是什么?

最佳答案

不知道消息大小正是您必须指定读取大小的原因(这适用于任何网络库,而不仅仅是 Go)。 TCP是一种流协议(protocol)。就 TCP 协议(protocol)而言,消息一直持续到连接关闭。

如果您知道要读到 EOF,请使用 ioutil.ReadAll

调用 Read 并不能保证获得您期望的一切。它可能会返回更少,也可能会返回更多,具体取决于您收到的数据量。执行 IO 的库通常通过“缓冲区”进行读写;你会有你的“读取缓冲区”,这是一个预先分配的 byte slice (最多 32k 是常见的),并且你每次想从网络读取时都重新使用该片。这就是 IO 函数返回字节数的原因,因此您知道上次操作填充了多少缓冲区。如果缓冲区已满,或者您仍需要更多数据,则只需再次调用 Read

关于tcp - 在 golang 中,如何使用 net.TCPConn 在不事先指定字节 slice 长度的情况下进行读取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24558535/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com