Проблемы с модулем сокета Python - PullRequest
1 голос
/ 04 октября 2011

Итак, я работаю над инфраструктурой Python IRC и использую модуль Python socket.Мне хочется использовать Twisted?Нет, не совсем.

В любом случае, у меня есть бесконечный цикл чтения и обработки данных из socket.recv(xxxx), где xxxx действительно не имеет значения в этой ситуации.Я разделяю полученные данные на сообщения, используя str.split("\r\n"), и обрабатываю их одно за другим.

Моя проблема заключается в том, что мне нужно установить конкретный «размер чтения» в socket.recv(), чтобы определить, сколько данных нужно прочитатьрозетка.Когда я получаю пакет данных (например, когда я подключаюсь к IRC-серверу и получаю MOTD.etc), всегда появляется сообщение, которое охватывает два «чтения» сокета (т.е. часть строки читается в одном socket.recv(), а остальное читается в следующей итерации бесконечного цикла).

Я не могу обработать неполученные сообщения, и я не уверен, есть ли способ их обнаружения.В идеальной ситуации я получал бы все, что находится в буфере, но не похоже, что socket предоставляет метод для этого.

Любая помощь?

Ответы [ 2 ]

4 голосов
/ 04 октября 2011

Вы действительно должны использовать select или poll, например, через asyncore или , выбрать или витой (что вы предпочитаете не делать).

Читая из сокета, вы никогда не знаете, сколько вы получите за каждое чтение.Вы можете получить несколько сообщений за один раз или разбить одно сообщение на несколько операций чтения.Вы всегда должны собирать данные в буфере до тех пор, пока не сможете их использовать, затем удалите данные, которые вы использовали, из буфера (но оставьте данные, которые вы еще не использовали).

Поскольку вы знаете своиввод имеет смысл строка за строкой, тогда ваш цикл приема может выглядеть примерно так:

  • , а true:
    • Добавить новые данные в буфер
    • Искать EOL, процесси удалите все полные строки
0 голосов
/ 04 октября 2011

Сокеты в потоковом режиме (например, TCP) никогда не гарантируют, что вы будете получать сообщения в каком-либо аккуратно оформленном формате. Если вы получаете частичные строки ввода - которые будут неизбежно иногда происходить - вам нужно удерживать частичную строку, пока не появится остальная часть строки.

Использование Twisted сэкономит вам много времени. А еще лучше, вы можете захотеть использовать существующую инфраструктуру IRC - их уже несколько.

...