我想使用TCP Pythonsocket
模块发送/接收“部分”数据。我的接收服务器端socket
设置为在单个recv
调用中接收40个字节的数据:
while True:
data = connection.recv(40)
if not data:
break
...
connection.close()
我有一些约500字节长的示例数据,已转换为bytes
对象,并由“客户端”发送到“服务器”:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
...
s.send(sample_data)
尽管我只有一个send
方法调用,但这是否意味着客户端一次发送40个字节的“ sample_data”,而服务器却一次不发送“ 40个字节”(只要不完整发送整个包)?
我在这篇文章中发现有SO_SNDBUF
用于设置的send
缓冲区大小的参数socket
,但是它与“普通”有什么不同,socket
而SO_SNDBUF
没有设置?
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是一种流协议,这意味着没有消息边界。它只是字节流。将其视为FIFO。如果客户端发送500个字节,则服务器上将总共接收500个字节。Arecv(40)
将按照发送顺序从1-40字节接收。您必须检查返回值以查看收到了多少。
您可能会收到以下数据长度:40,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,40,40,15
recv(40)
然后在阻塞的套接字上添加另一个将挂起,直到至少接收到一个字节为止;如果客户端关闭套接字,则返回零字节。
服务器负责将数据连接在一起,并确定是否接收到完整的数据传输。通常,您需要定义一个协议来决定完整消息的含义。这可能是“ 500字节是完整的消息”。您还需要处理以下情况:发送了两条消息recv
,一条消息可以从一条消息的末尾到另一条消息的末尾获取数据。
通常,您不需要使用套接字选项来调整缓冲区大小。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句