avi*_*oam 3 python sockets tcp python-2.7
我正在尝试使用 python 套接字一个接一个地发送 3 个数据包。Python 将其优化为 1 或 2 个数据包。我通过 sleep 命令阻止了它,但需要很长时间。我想打开 TCP urg 标志,有人知道该怎么做吗?
或者你还有其他独奏吗?
客户端:
import socket
from time import sleep
IP = '127.0.0.1'
PORT = 5081
BUFFER_SIZE = 1024
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((IP, PORT))
s.send('1'*5)
#sleep( 1)
s.send('2'*5)
#sleep( 1)
s.send('3'*5)
s.close()
Run Code Online (Sandbox Code Playgroud)
服务器端:
import socket
IP = '0.0.0.0'
PORT = 5081
BUFFER_SIZE = 1024
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((IP, PORT))
s.listen(1)
connection, address = s.accept()
while 1:
#Here I expected to get the 1nd value
data1 = connection.recv(BUFFER_SIZE)
#end of communication
if not data1:
break
print 'data1', data1
#Here I expected to get the 2nd value,but both inputs arrived here, 22222 and 33333
data2 = connection.recv(BUFFER_SIZE)
print 'data2', data2
#Here I expected to get the 3nd value
data3 = connection.recv(BUFFER_SIZE)
print 'data3', data3
connection.close()
Run Code Online (Sandbox Code Playgroud)
谢谢阿维诺姆
你甚至不应该尝试。TCP 是一个流协议,应该被用作流协议(意味着单个字节序列)。即使您在系统上使用 localhost 时设法保持数据包的分离,但如果您在不同主机之间使用它,或者只是在升级 TCP/IP 堆栈后,它也可能会中断。一旦您的数据包通过代理或软件过滤器,任何事情都可能发生。
分离流上不同对象的正确方法是使用上层协议对对象发送方进行编码并在客户端对其进行解码。例如,大小为一或两个字节(如果多于一个字节,则按网络顺序),后跟相关字节。或者您可以想象一个带有命令、标头和数据的文本协议,或者[将您想要的任何内容放在这里]