fox_12
@fox_12
Расставляю биты, управляю заряженными частицами

Работа с сокетом в python?

Есть код на php:
if ( ! feof($this->_socket))
        {
            $packet->clean();
            $this->read($packet);
        }

Я его переписываю на Python, немного изменяя под свои нужды
while True:
            self.packet.clean()
            self.packet.read()
            ...

Где в self.packet.read - последовательное чтение из сокета и распаковка нужных данных что-то вроде
...
self.code = int(struct.unpack('B', self.sock.recv(1))[0])
version = int(struct.unpack('B', self.sock.recv(1))[0])
...

после чтения которых, должна вычитываться очередная порция, если таковую сервер высылает, и продолжать выполнение, если данных от сервера более нет.

И тут сталкиваюсь с проблемой. Код на php вычитывает нужную порцию данных, успешно их обрабатывает до конца, и успешно продолжает выполнение программы. Код на python же, вычитывает до конца, обрабатывает их, но ожидаемо, - останавливается в этом месте, продолжая ожидать данные, которые сервер уже не отправит. Вылет и обработка исключения по таймауту ломает логику программы.
Каким образом корректно отработать эту ситуацию под Python 3.x? Кто сталкивался?
  • Вопрос задан
  • 740 просмотров
Пригласить эксперта
Ответы на вопрос 2
@red-barbarian
обычно так делается
def recv_basic(the_socket):
    total_data=[]
    while True:
        data = the_socket.recv(8192)
        if not data: break
        total_data.append(data)
    return ''.join(total_data)
Ответ написан
@MechanicZelenyy
Может быть проблема в том, что while True: - это бесконечный цикл и нужно вызвать break после того, как данные вычитаны?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы