Управление событиями через собственный TCP-сервер с длинным опросом
-
19-09-2019 - |
Вопрос
Я пытаюсь написать собственный сервер длинных опросов на основе TCP, который будет служить посредником для других TCP-соединений, требующих большей устойчивости, чем может обеспечить мобильный телефон.
Я пытаюсь это сделать — написать асинхронный TCP-сервер на C# и соответствующий TCP-клиент, также написанный на C#.
Принцип работы длительного опроса (насколько я понимаю) заключается в том, что вы открываете TCP-соединение с сервером, и сервер останавливается перед отправкой данных обратно через сокет.Вы находите интервал Heartbeat, который работает в сети мобильной связи (я слышал, что работает около 8 минут?), и отправляете пустой пакет, если нет обновленных данных.
Вот тут-то и начинается моя беда.Не могу понять, как «связать» запрос моего клиента на данные с обработчиком событий, работающим на сервере…
Поток должен быть примерно таким («клиент» на телефоне):
Пользователь запускает мое приложение
Клиент отправляет запрос на уведомление, если данные изменились
Сервер «связывает» (регистрирует) объект сокета клиента в «обработчик событий», который вызывается другими TCP-соединениями сервера, о которых я говорил!
Событие
o Если он сработал (поступили новые данные), отправьте данные клиенту.
o Если он не сработал (нет новых данных), отправьте клиенту пакет «EmptyChanges».
Клиент получает данные на телефон и обрабатывает их (вызывает обработчик событий в зависимости от типа полученного пакета и передает ему «данные», полученные от сервера)
Клиент отправляет запрос на уведомление, если данные изменились
Итак, моя проблема в том, что я не могу придумать дизайн, который бы выполнял то, что я хочу.Проблема в том, что я не знаю, КАК сделать №3.Как мне «связать» один обработчик событий с другим?И они почти гарантированно будут работать в разных потоках!
Итак, мое приложение будет выглядеть примерно так (весь псевдокод):
Class AppClass
{
Main()
List<Client> clients;
List<DataServers> dataServers;
DataReceivedFromServer(Data stuff)
{
}
MessageReceivedFromPhone(PhoneMessage pm, object sender)
{
//Loop here until HeartBeat interval reached
Int totalTime = 0;
While(totalTime < HEARTBEAT_INTERVAL)
{
If( ) // If we have received data from the server, and the client WANTED that data, send it now
{
}
}
}
}
Вроде?Я хочу, чтобы оно управлялось событиями, но у меня чертовски много времени уходит на то, чтобы выяснить, как управлять приложением с помощью стиля, управляемого PUSH, а не с использованием стиля PUSH.то, к чему я «привык» к опросам.
Пожалуйста, будьте добры, так как я могу сделать что-то слишком сложное и глупое, потому что это моя первая настоящая попытка использовать программирование Socket (никогда оно не требовалось), и это особенно сложно из-за того, что сотовые телефоны находятся в временных сетях, и моему серверу необходимо сохранять местоположение этих телефонов с помощью ОТКРЫТОГО TCP-соединения.
Серверная платформа:Окна
Язык сервера:С#
Платформа тестового клиента:Окна
Язык тестового клиента:С#
Целевая клиентская платформа:Windows Mobile 6.5, iPhone, Android (клиенты будут написаны отдельно)
Целевой язык клиента:C#, Obj-C или MonoTouch, Java
Решение
Если кому-то интересно, я отказался от идеи написать собственный TCP-сервер для управления моими соединениями.При этом было так много накладных расходов, что я, по сути, копировал бы написание собственного HTTP-сервера, поэтому вместо этого я использовал инфраструктуру Web Tornado на Python в качестве своего сервера и пишу серверные службы для связи через HTTP. запросы в Web Tornado.
Вместо использования длинного опроса я собираюсь использовать SMS для push-уведомлений.Я считаю, что все основные телефонные платформы реализуют что-то похожее на перехватчик SMS, который вы написали...если придет SMS определенного формата, оно запустит ваш собственный код.Это позволяет мне снять требования к использованию последовательных открытых соединений (кроме живого чата, который будет использовать длинный опрос в стиле кометы, но соединение может оставаться открытым только в том случае, если оно активно в течение примерно 5 минут).
По сути, платформа Web Tornado служит корпоративной шиной в моей архитектуре.