C ++, как принимать данные с сервера? - PullRequest
3 голосов
/ 21 октября 2011

Моя ситуация: я хотел бы создать хобби-проект для улучшения моего C ++, включая программирование в реальном времени / с задержкой.

Я решил, что напишу небольшую Java-программу, которая будет посылать много случайных цен на акцииклиенту, где клиент будет написан на C ++ и будет принимать все цены.

Я не хочу, чтобы клиент C ++ должен был опрашивать / иметь цикл while, который непрерывно проверяет данные, даже если их нет.

Какие у меня есть варианты для этого?Если проще иметь сервер C ++, то это не проблема.

Полагаю, для начала мне придется использовать пакет boost ASIO для работы в сети?

Я буду делать это наWindows 7.

Ответы [ 3 ]

1 голос
/ 21 октября 2011

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

Вы можете использовать сервлет Java, чтобы принимать данные по HTTP и писать кодмода.Точно так же в boost :: asio есть пример сервера , с которого следует начать.Внутри вы можете включить постоянный HTTP, чтобы соединения не открывались / закрывались часто.Это значительно упростит модель кодирования.

1 голос
/ 21 октября 2011

Почему бы просто не сделать так, чтобы сервер Java принимал соединения, а затем подождать некоторое время? например 10 секунд. В течение этого времени, если данные станут доступны, отправьте их и закройте соединение.

Тогда клиент C ++ может иметь поток, открывающий соединение всякий раз, когда завершилось предыдущее.

Это должно дать довольно низкую задержку без частого создания соединений при отсутствии новых данных.

Это в основном модель веб-программирования Comet , которая используется во многих приложениях.

0 голосов
/ 21 октября 2011

Я не хочу, чтобы клиент C ++ должен был опрашивать / иметь цикл while, который постоянно проверяет данные

Кто-то ДОЛЖЕН.

Не обязательно быть вами. Я никогда не использовал boost ASIO, но он мог бы обеспечить регистрацию обратного вызова. Если да, то просто зарегистрируйте вашу функцию обратного вызова с boost, boost сделает ожидание и перезвонит вам, когда получит некоторые данные.

Другой вариант, конечно, что вы используете некоторые функции, которые являются синхронными. Как (не настоящая функция) Socket.read(), которая блокирует поток до тех пор, пока в сокете не будут данные или он не будет закрыт. Но в этом случае вы посвящаете свою нить.

- изменить -

О самом сообщении. Просто выберите любой механизм IPC (сокеты / каналы / файлы / ...), кто-то уже описал один, я думаю. Как только вы отправляете данные, сами данные «кодируются» и «декодируются» вами, так что вы можете создать свой собственный протокол. Например. "%%<STOCK_NAME>=<STOCK_PRICE>##" где "%%", = и ## (маркеры для отметки начала, середины и конца), которые вы добавляете на стороне отправителя и удаляете на стороне получателя, чтобы получить название и цену акции.

Вы можете разрабатывать протокол в зависимости от ваших потребностей. Также вы можете отправить рекомендацию о покупке / продаже или текстовые сообщения с основными новостями биржи. Пока ваш клиент и сервер понимают, как данные «кодируются», вы хороши.

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

НТН

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...