Python TCP/IP 套接字数据流中断问题
我使用的是一个叫做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()可能在一次调用中接收到一部分行,或者一整行加上一部分行,所以你需要把数据缓存起来,只提取完整的行。
希望这对你有帮助……