2014-09-11 3 views
0

Мне нужно разработать веб-приложение. Это приложение будет внедрять веб-терминал для некоторого сервера приложений (этот проект предоставит альтернативный тонкий и кросс-платформенный веб-клиент вместо двоичного клиента только для Windows). Я понимаю, что использование ajax для связи с app.server неверно, потому что нам нужно быть в режиме реального времени. Поэтому нам нужно нечто более асинхронное, чем ajax. Я планировал использовать веб-сокеты.Связь Java WebSocket и TCP Socket

Но мое приложение также должно связываться с удаленным сервером приложений. Существующая реализация основана на TCP. Поэтому мы должны использовать эту существующую спецификацию протокола. Я могу представить, как подключиться к удаленному серверу, когда будет принято новое соединение с веб-сокетами. И я знаю, что реализация веб-сокета проста, потому что это событие управляется. Однако я знаю, что классический сокет java основан на потоке, и я должен читать из потока, и мой код будет заблокирован, пока некоторые данные не появятся с удаленной стороны. Таким образом, код не сможет реагировать на другие события.

Я вижу один из способов сделать это правильно - используйте потоки для классических сокетов. Но я не знаю, правильно ли это для веб-приложения Java. Пожалуйста, предложите мне любой способ.

+0

«event-driven» или «stream-based» (как вы думаете о них, я бы сказал, что «управляемые событиями» и «блокировка») не связаны с протоколом; они связаны с используемой библиотекой. – immibis

+0

Я забыл сказать. Возможно, это важно. Каждое соединение с websocket будет иметь свой собственный tcp-сокет для связи с удаленными серверами. Это требование текущей реализации приложений. – SSH

+0

NOw Я думаю, что это должен быть какой-то двухсторонний конвертер между некоторым бинарным протоколом в протоколе tcp socket и text (json) на websocket. Поэтому я хочу знать, что является самым простым и правильным способом сделать это. – SSH

ответ

0

Существует несколько способов, по которым Java может взаимодействовать асинхронно, чтобы разные соединения не блокировали друг друга. Нынешним стандартом является Java Non-blocking IO framework, который абстрагирует каждое сетевое соединение в виде Channel и группирует их под номером Selector, который обнаруживает, какие каналы в настоящее время готовы к приему данных или которые только что получили данные, которые могут быть получены вашим кодом.

Каркас обрабатывает фактический IO с отдельными потоками фона, поэтому запись и считывание из сокета происходит практически мгновенно.

Смежные вопросы