我试图从与redis客户端的tcp连接(一个正在运行redis-cli的终端)中读取一些消息。但是,net包的朗读命令要求我提供一个片段作为参数。每当我给一个没有长度的切片时,连接就会崩溃,围棋程序就会停止。我不知道我的字节消息需要多少长度。因此,除非我指定了一些大得离谱的片段,否则这个连接将始终关闭,尽管这似乎是浪费。我想知道,不需要事先知道消息的长度,就能保持联系吗?我很想解决我的具体问题,但我觉得这个问题比较笼统。为什么我要知道手边的长度?图书馆就不能给我一片合适的尺寸吗?
或者人们建议的其他解决方案是什么?
发布于 2014-07-03 08:45:01
不知道消息大小正是您必须指定读取大小的原因(这适用于任何网络库,而不仅仅是Go)。TCP是一种流协议。就TCP协议而言,消息一直持续到连接关闭为止。
如果您知道要阅读到EOF,请使用ioutil.ReadAll
打电话给Read
并不能保证给你带来你所期望的一切。它可能返回的较少,它可能返回更多,这取决于您已经收到的数据。做IO的库通常通过一个“缓冲区”进行读写;您将拥有"read“,这是一个预先分配的字节段(最多32k是常见的),并且您每次想从网络中读取时都重复使用该块。这就是IO函数返回字节数的原因,因此您知道上次操作填充了多少缓冲区。如果缓冲区已被填充,或者仍然需要更多数据,则只需再次调用Read
即可。
发布于 2021-05-08 09:58:51
有点晚了但是..。
https://stackoverflow.com/questions/24558535
复制相似问题