Python套接字接收损坏的信息

时间:2017-04-21 23:06:34

标签: python sockets

我试图了解发送和接收是如何工作的。

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

服务器:

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) )

然后我将while循环更改为:

服务器:

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 个答案:

答案 0 :(得分:1)

你的问题是由Nagle algorithm引起的,它通过组合一些小的外发消息来工作,并且当TCP是一个流协议时立即发送它们。您可以通过调用sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)来启用team_1 = {'symbol':['FDX','GOOGL','ORCL','ORCL'], 'date':['31/12/2013','30/06/2016','21/07/2015','18/07/2015'], 'shares':[154,2367,293,304], 'trader':['Max','Max','Max','Sam']} df1 = pd.DataFrame(team_1) team_2 = {'symbol':['ORCL','FB','ACER','HP','ABBV'], 'date':['23/08/2015','04/07/2014','06/12/2013','31/11/2012','05/06/2010'], 'shares':[345,567,221,889,445], 'trader':['John','John','Sally','John','Kate']} df2 = pd.DataFrame(team_2) 套接字选项,以便尽快发送数据,即使只有少量数据也是如此。在接收器方面,它也不会一次获得一个数据包,如果你想要“两个插座之间的连续对话而不将字节混合在一起”,你必须自己实现消息边界。