Двусторонний Socket I / O с асинхронным или альтернативным в Python - PullRequest
2 голосов
/ 21 июня 2011

Я работаю над серверной частью веб-приложения Django, которое также должно выполнять сокет-ввод / вывод с сенсорными устройствами в полевых условиях через GPRS, используя связь TCP.

Мне удалось получить данные с устройств с помощью модуля python asyncore. Я настраивал устройства для отправки данных через TCP на сервер, а затем я собирал эти входящие данные, используя asyncore (что я выбрал из-за асинхронного подхода к вводу-выводу через сокеты).

Документы говорят о перегрузке asyncore.dispatcher или asyncore.dispatcher_with_send, чтобы иметь возможность реализовать пользовательские действия в обратных вызовах, таких как handle_write, handle_read и т. Д.

В настоящее время я могу получать входящие данные, подбирая их методом handle_read, но недавно появилось новое требование:

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

Итак, я добавил код в метод handle_write в моей реализации, код для отправки команд «идентифицировать себя» на устройство, которое подключилось к нам. Но моя проблема в том, что этот код никогда не выполняется, даже когда устройства продолжают подключаться, а handle_read показывает, что я могу получить входящие данные!

Я попытался поместить код "идентифицировать себя" (который посылает некоторые шестнадцатеричные команды, как показано ниже)

print 'Attempting to Identify Remote Party...'
self.send('\x40\x40\x00\x11\x12\x34\x56\xFF\xFF\xFF\xFF\x90\x01\x41\xCF\x0D\x0A')

надеясь, что ответ придет через handle_read, пока я буду удерживать данные, которые были отправлены ранее, но это не удалось! Что я могу сделать?

Какой лучший / лучший способ это осуществить?

1 Ответ

0 голосов
/ 07 июля 2011

Если вы реализуете протокол, который имеет некоторые команды и некоторый обмен данными, то лучше использовать библиотеку asynchat вместе с asyncore.

...