2017-04-21 21 views
0

我想了解发送和接收如何工作。Python套接字接收损坏的信息

我试图连续发送数据到服务器,我注意到服务器会收到混合字节,因为我一次发送很多数据。见我的代码:

服务器:

import socket, struct 

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

server.bind(("",1996)) 

server.listen(0) 

c,d = server.accept() 

while True: 

    data = c.recv(1024) 
    print(struct.unpack("i", data)[0]) 

客户:

import socket, struct 

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

server.connect(("192.168.1.4",1996)) 

while True: 

    data = 1 
    server.send(struct.pack("i", data)) 

然后我改变而循环到这一点:

服务器:

data = c.recv(1024) 
print(struct.unpack("i", data)[0]) 
c.send(str.encode("Server received your message. You now can continue 
sending more data")) 

客户:

data = 1 
server.send(struct.pack("i", data)) 

#Wait to secure the send. 
server.recv(1024) 

这是行得通的。我确保客户端在 服务器已经收到之前的发送之前不会发送数据。

但是如果我想为服务器也做同样的事情呢?我怎样才能确保服务器将以安全的方式发送字节到客户端?

我已经尝试过这一点,我注意到,我创建了一个无限循环,因为(我用多线程,以便发送,并在同一时间在服务器上接收):

客户端已发送一些数据,然后等待从服务器 获得他可以再次发送的信号。

服务器正在获取一些数据,然后发送信号,然后等待用户发出的信号,他可以再次发送。

但是因为客户端实际上是重新发送数据,整个事情又一次发生,这导致我无尽的谈话 - 回复循环。

那么我能做些什么来使两个套接字之间的连续对话不混合在一起?

回答

1

你的问题是由Nagle algorithm引起的,它通过组合一些小的传出消息来工作,并且一次发送它们,因为TCP是一个流协议。通过调用sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)尽可能快地发送数据,即使只有少量数据,您也可以启用TCP_NODELAY套接字选项。而在接收端,一次也不会获得一个数据包,如果你想要“在两个套接字之间进行连续对话而不将字节混合在一起”,你必须自己实现消息边界。