Python TCP/IP 套接字数据流中断问题

0 投票
1 回答
1244 浏览
提问于 2025-04-16 16:51

我使用的是一个叫做EX-9132的tcp/ip转rs232的转换器,连接到一个数据记录仪上来接收数据。在我通过tcp发送请求(chr27)来请求数据后,传输在接收到所有可用数据之前就中断了。我希望在接收到所有数据后再结束传输。下面的代码是用Python写的。

有没有人知道怎么延长接收时间呢?

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
HOST = '192.168.1.5'
PORT = 4660
s.connect((HOST, PORT))
s.send( b'\x1b' ) #this is "chr27" to sent to the device

data = ""
data += s.recv(200)
f = open('/home/fspr/minicom/201104cc-tcp.txt', 'a')
data1 = data.replace("/t", ";")
f.write(data1)
f.close()
print data.replace("/t", ";")
s.close()

1 个回答

3

你的代码只调用了一次recv(200)。recv()的工作方式是,它会返回至少1个字节,最多200个字节(在这个例子中)。如果没有数据可用,它会一直等待。如果服务器关闭了连接,它会返回一个空字符串。

在不知道完整协议的情况下,我只能猜测,但你至少需要在recv()调用上循环,直到你收到服务器发送的完整数据。例如,如果服务器发送了一大堆数据然后关闭了连接,像这样做可能会有效:

data = ""
while True:
    chunk = s.recv(200)
    if not chunk: break
    data += chunk

因为这是一个数据记录器,我的另一个猜测是,你会收到数据行,直到你告诉服务器停止(可能是通过发送另一个字符)。在这种情况下:

data = ""
while True:
    chunk = s.recv(200)
    if not chunk: break
    data += chunk

    # Test for a complete line in the data buffer.
    n = data.find('\n')
    if n != -1:
        # Remove the line from the front of the buffer.
        # Leave any remaining lines or partial lines in data.
        line,data = data[:n+1],data[n+1:]
        print line

需要注意的是,TCP的工作方式是,服务器可能会发送两行不同的数据,但recv()可能在一次调用中接收到一部分行,或者一整行加上一部分行,所以你需要把数据缓存起来,只提取完整的行。

希望这对你有帮助……

撰写回答