我想使用TCP Pythonsocket
模块发送/接收“分区”数据。
我的接收服务器端socket
被设置为在一个recv
调用中接收40字节的数据:
while True:
data = connection.recv(40)
if not data:
break
...
connection.close()
我有一些大约500字节长的示例数据,转换为bytes
对象,由“client”发送到“server”:
虽然我只有一次对send
方法的调用,但这是否意味着只要整个包没有完全发送,客户端一次发送40字节的“示例数据”,而服务器一次“请求”40字节?在
我发现在this post中有一个SO_SNDBUF
参数,它为socket
设置send
缓冲区的大小,但是它与没有设置SO_SNDBUF
的“普通”socket
有什么不同?在
buffer_size = 40
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, buffer_size)
...
s.send(sample_data)
TCP是一种流协议,这意味着没有消息边界。它只是一个字节流。把它想象成先进先出。如果客户机发送500个字节,那么服务器上总共有500个字节要接收。
recv(40)
将按发送顺序接收1-40个字节。你必须检查返回值,看看你收到了多少。在您可以接收的数据长度为:40,40,40,40,40,40,40,40,40,40,40,20
或者你可以收到类似的信息:40,40,5,40,40,40,40,40,40,40,40,40,15
在阻塞套接字上生成另一个
recv(40)
将挂起,直到至少多收到一个字节,或者如果客户端关闭该套接字,则返回零字节。在由服务器将数据连接在一起并确定是否接收到完整的数据传输。通常,您需要定义一个协议来决定一个完整的消息需要什么。这可能是“500字节是一个完整的消息”。您还需要处理这样的情况:发送了两条消息,而一条
recv
可以从一条消息的末尾和另一条消息的开头获取数据。在通常不需要使用套接字选项调整缓冲区大小。在
相关问题 更多 >
编程相关推荐