Как я могу реализовать хороший клиент-серверный подход? - PullRequest
1 голос
/ 06 февраля 2012

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

Как мне этого добиться? Сейчас я пытаюсь реализовать базовую связь с сокетами, но мне не удается их передать. Я читал, что использование сокетов + потоков обычно является хорошим подходом для клиент-серверных приложений.

Не могли бы вы порекомендовать мне какую-нибудь сеть или книгу, чтобы прочитать об этом, или пришлите мне пример кода для изучения?

Как вы думаете, я должен использовать другой подход, лучше, чем сокеты? может быть, библиотека более высокого уровня (мне это понадобится для c ++ и java) или совершенно другой способ?

РЕДАКТИРОВАТЬ:

Я добавлю дополнительную информацию.

Я бы хотел добиться следующего:

В моей программе на C ++ есть основной цикл, в котором я хотел бы получить вызов, подобный GetUpdatedDataFromRemoteDevice(), где я читаю новые значения некоторых числовых переменных, которые ранее были обновлены из сети (например, сокета).

В конце концов, программе на C ++ нужно будет отправить сообщение на удаленное устройство, сказать ему, чтобы он отправлял другие данные, и после этого продолжать получать обновленные значения.

Из Java-программы (удаленного устройства) запущенное приложение представляет собой интерактивный сенсорный экран, который не может быть заблокирован сетевыми передачами, поскольку он должен продолжать работать для пользователя, поэтому вся работа в сети должна выполняться в отдельном потоке.

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

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

Ответы [ 3 ]

3 голосов
/ 06 февраля 2012

ICE - современная и хорошая библиотека для распределенных приложений:

  • много языков, таких как C ++ и Java
  • много платформ
  • GNUGPL
  • хорошая производительность
  • простота использования

Сначала вы определяете сообщения, которые вы хотите обменять между сервером и клиентом.
Затем вы реализуетеИсходный код C ++ и Java для обработки этих сообщений.

Больше информации на http://zeroc.com/ice.html
Веселитесь; -)

РЕДАКТИРОВАТЬ: Мне нужно использовать ACE в некоторых проектах.Я могу сказать, что ACE очень старый, возможно, зрелый, но использует устаревшие правила кодирования C ++ :-( Поэтому ACE не так прост в использовании, как STL или BOOST . Более того, ACE недействительно эффективный ... я предпочитаю ICE; -)

1 голос
/ 06 февраля 2012

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

Если вам не нужны мгновенные уведомления от сервера к клиенту, я предлагаю использовать HTTP в качестве протокола между клиентом и сервером. Клиент может время от времени опрашивать сервер на наличие новых сообщений.

Во всяком случае, проблема была решена уже несколько раз.

http://activemq.apache.org/

http://www.rabbitmq.com/devtools.html

http://www.cs.wustl.edu/~schmidt/ACE-overview.html

0 голосов
/ 06 февраля 2012

Я однажды сделал что-то подобное.В моем случае было проще подключить мое приложение C ++ к локальному приложению Java с помощью JNI, а затем заставить два приложения Java общаться друг с другом.

...