【发布时间】:2019-11-10 19:31:38
【问题描述】:
我正在使用 python 3.x 和套接字模块。服务器在 ipv4 地址上运行并使用 tcp。 我阅读了一些关于如何发送和接收数据的教程。为了让服务器或客户端确保发送了整个消息,您只需检查发送的数据量是否等于消息的大小:
def mysend(self, msg):
totalsent = 0
while totalsent < MSGLEN:
sent = self.sock.send(msg[totalsent:])
if sent == 0:
raise RuntimeError("socket connection broken")
totalsent = totalsent + sent
来源:https://docs.python.org/3/howto/sockets.html#socket-howto
为了确保客户端已收到完整的响应,this tutorial 建议在响应的开头添加响应的大小。
我的问题:
- 如何确保我收到了指示消息大小的消息的第一部分(假设我的消息包含 1000 个字符,我需要四个字符来指示大小)?
- 为什么我不能只在消息的开头添加一个指定的符号,如“”,这样我就知道它从哪里开始和结束了?
编辑:
- 当我使用
sock.recv(1024)时,我的消息只有 500 到 1000 个字符,这不能确保我收到所有消息吗?
【问题讨论】:
-
您提出了非常好的问题,并且得到了一些非常好的回答。值得强调的一点:你正在读写一个字节流,它不同于它的逻辑内容。因此,您的客户将一次读取一个缓冲区,直到没有任何内容可供读取。无论消息多长或短。第一步:1)“读取字节(并保存它们)直到你完成”第二步:2)解释你读到的内容。
-
还可以查看
socket.makefile。这是一个带有示例的答案:stackoverflow.com/a/55840026/235698