簡體   English   中英

python tcp/ip 套接字數據流被中斷

[英]python tcp/ip socket datastream gets interupted

我使用專家 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()

您的代碼只調用 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 的工作方式,服務器可以 send() 兩個單獨的行數據,但 recv() 可以在一次調用中接收部分行,或完整行加上部分行,因此您必須緩沖數據並僅提取緩沖區中的完整行。

希望這可以幫助...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM