python tcp / ip socket datastream被中断

时间:2011-05-02 21:32:15

标签: python sockets

我使用专家EX-9132的tcp / ip到rs232转换器,我连接到数据记录器接收数据,在发送请求(chr27通过tcp)请求数据后,传输在接收所有可用数据之前被中断。我希望在收到所有数据后完成传输。下面的代码是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 个答案:

答案 0 :(得分:2)

您的代码只调用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()可以在一次调用中接收到部分行,或者完整的行加上部分行,所以你必须缓冲数据并从缓冲区中仅提取完整的行。

希望这会有所帮助......