Как отличить ответы сервера от объявлений, отправляемых сервером при использовании витой библиотеки? - PullRequest
0 голосов
/ 28 сентября 2018

Ситуация такова, что я хочу создать клиентское приложение, которое подключается к серверу (это собственный протокол TCP), поддерживает постоянное соединение и иногда отправляет некоторые запросы, получает ответы.Пока что то, чего я могу легко достичь с помощью библиотеки Python Twisted.

Однако в этом случае сервер довольно болтлив и может в любое время принять решение о том, что он отправит сообщение-объявление всем своим подключенным клиентам.С точки зрения протокола, в заголовке пакета есть поле (назовем его packetid), которое позволяет мне сопоставлять ответы на запросы и отличать пакеты объявлений от них, без проблем с точки зрения протокола.

Теперь я думаю, как реализовать код, который сможет справиться с этим, чтобы отличать входящие ответы от объявлений сервера.Моя идея состоит в том, чтобы просто поддерживать словарь в пользовательской реализации Protocol и сохранять там объекты Deferred для каждого запроса (ключом будет packetid).Получив индивидуальное сообщение через receivedData, я использую поле packetid, указанное в моем пакете, для поиска в словаре и вызываю соответствующие обратные вызовы для соответствующих Deferred, если это ответ на некоторые из предыдущих запросов, в противном случае реагируютк нему как к сообщению сервера.

Это решение хорошо, или есть какое-то лучшее решение, возможно, использующее некоторые из уже предоставленных скрученных механизмов?Кроме того, существует ли какой-либо существующий протокол с такими же характеристиками, протокол, который необходим в том же соединении, чтобы отличать ответы от других сообщений (чтобы я мог вдохновиться его реализацией)?

...