Поток данных Python TCP / IP прерывается - PullRequest
0 голосов
/ 03 мая 2011

Я использую конвертер tcp / ip в rs232 от эксперта EX-9132, где я подключаюсь к регистратору данных для получения данных, после отправки запроса (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 Ответ

2 голосов
/ 03 мая 2011

Ваш код вызывает 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 () может получить за один вызов частичную строку или полную строку плюсчастичная строка, поэтому вы должны буферизовать данные и извлечь из буфера только полные строки.

Надеюсь, это поможет ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...