Существует ли API-интерфейс запроса-ответа для Java? - PullRequest
4 голосов
/ 01 июля 2011

Я ищу простую библиотеку Java, которая позволила бы писать код следующим образом:

Remote remote = Remote.connect("some_host:1234"); 
Future<String> response = remote.request("hello");
// do something else
String reply = response.get();

Она должна основываться на tcp / ip и использовать простые текстовые сообщения по сети, чтобынезависимость от языка, так что не Java-серверы также могут отправлять / получать запросы / ответы.

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

Существует ли какой-либо существующий API, подобный этому?

PS: ... чем проще, тем лучше!

Ответы [ 5 ]

1 голос
/ 01 июля 2011

Реализации TCP обычно предоставляют приложениям только потоковый интерфейс без доступа к отдельным пакетам.(Кроме того, некоторые маршрутизаторы / брандмауэры могут перепаковывать данные в потоках TCP, что означает, что они не обязательно поступают в тех же блоках, что и отправленные.) Таким образом, нам действительно нужно использовать некоторый протокол упаковки наверх TCP (или действительно поверх любой потоковой пары ).

Действительно простым протоколом будет одна строка для каждого запроса / ответа , но это будетработать только с небольшими размерами данных (или вам нужно каким-то образом экранировать встроенные символы новой строки).

Если вы хотите, чтобы это было более структурированным, вы можете использовать что-то на основе XML (например, XMPP): каждый запрос / ответ будет завершенЭлемент XML (включая подэлементы, если необходимо).

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

В качестве примеров HTTP использует первый подход (с 1.1 - до того, как для каждого соединения была только одна пара запрос / ответ),в то время как протокол X использует второй.

Для HTTP уже есть реализации (как на стороне клиента, так и на стороне сервера), и его можно сделать полностью простым текстом (в зависимости от данных, которые вы отправляете).

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

Так что, извините, нет реального ответа, кроме , используйте HTTP .

1 голос
/ 01 июля 2011

Используйте простые сокеты: -)

Сокеты используют TCP, а TCP заботится о полезных нагрузках, множественных пакетах и ​​порядке.Вам все равно придется обрабатывать потоки, но java.util.concurrent имеет все необходимое для этого.Не забудьте выбрать кодировку символов для ваших строк.

1 голос
/ 01 июля 2011

Взгляните на JMS .

0 голосов
/ 01 июля 2011

Я не знаю ни одной библиотеки, которая бы давала вам такой слой поверх сокетов.Протокол IMAP имеет уровень кадрирования, который очень похож на это, но я не знаю ни одного способа использовать его независимо от остальной части IMAP.Такая библиотека была бы достаточно простой для написания и потенциально весьма полезной, поэтому, если кому-то захочется попробовать ее, я призываю их сделать это!

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

0 голосов
/ 01 июля 2011

С Apache Mina вы можете разработать собственный протокол, но он может быть излишним.

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