不带确认的Python3 socket.recv

问题描述

我的python程序正在与一个设备通讯,每当它收到对push / ack的确认时,该对话都会延迟整整一秒。对话长达数百甚至数千条消息,因此自然而然地我想找到一种解决方法

是否有一种方法可以打开与我设备的连接,并保持打开状态以发送给设备,但不使用socket.recv()确认收到的消息?

import socket

s = socket.socket()
s.bind(('',xxxxx))
s.connect(('x.x.x.x',xxxxx))

while True:
    try:
        msg = input()
        if 'exit' in msg:
            data = b'I am done Now,bye'
            s.send(data)
            data = s.recv(2048)
            print('recieved final message: ' + str(data))
            break
        msg = msg.encode()
        s.send(msg)
        print('sent message: ' + str(msg))
        data = s.recv(2048)
        print('received message: ' + str(data))
        print()
        data = ''
    except Exception as e:
        print(e)

s.close()

解决方法

在接收到数据时,ACK是必不可少的。否则,发送方将简单地假设未接收到数据,并将尝试重新发送数据。因为只有一个(最初很小的)非确认数据窗口是可以接受的,所以这实际上将使通信停止。因此,建立这样的连接没有任何意义,这就是为什么没有办法建立连接的原因。