Управление событиями через собственный TCP-сервер с длинным опросом

StackOverflow https://stackoverflow.com/questions/1726631

Вопрос

Я пытаюсь написать собственный сервер длинных опросов на основе TCP, который будет служить посредником для других TCP-соединений, требующих большей устойчивости, чем может обеспечить мобильный телефон.

Я пытаюсь это сделать — написать асинхронный TCP-сервер на C# и соответствующий TCP-клиент, также написанный на C#.

Принцип работы длительного опроса (насколько я понимаю) заключается в том, что вы открываете TCP-соединение с сервером, и сервер останавливается перед отправкой данных обратно через сокет.Вы находите интервал Heartbeat, который работает в сети мобильной связи (я слышал, что работает около 8 минут?), и отправляете пустой пакет, если нет обновленных данных.

Вот тут-то и начинается моя беда.Не могу понять, как «связать» запрос моего клиента на данные с обработчиком событий, работающим на сервере…

Поток должен быть примерно таким («клиент» на телефоне):

  1. Пользователь запускает мое приложение

  2. Клиент отправляет запрос на уведомление, если данные изменились

  3. Сервер «связывает» (регистрирует) объект сокета клиента в «обработчик событий», который вызывается другими TCP-соединениями сервера, о которых я говорил!

  4. Событие

    o Если он сработал (поступили новые данные), отправьте данные клиенту.

    o Если он не сработал (нет новых данных), отправьте клиенту пакет «EmptyChanges».

  5. Клиент получает данные на телефон и обрабатывает их (вызывает обработчик событий в зависимости от типа полученного пакета и передает ему «данные», полученные от сервера)

  6. Клиент отправляет запрос на уведомление, если данные изменились

Итак, моя проблема в том, что я не могу придумать дизайн, который бы выполнял то, что я хочу.Проблема в том, что я не знаю, КАК сделать №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 служит корпоративной шиной в моей архитектуре.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top