Мультиплексировать множество независимых полнодуплексных потоков в одном и том же сокете TCP - PullRequest
4 голосов
/ 26 августа 2011

Возможно, это самый странный вопрос, который здесь задают. Я постараюсь объяснить это как можно лучше.

Мне нужно быстро разработать сетевое приложение на Java, интегрировать кучу старых сетевых приложений (у меня уже есть код для них) и заставить все работать вместе. Каждое старое приложение станет подфункцией нового; новый по сути является «оберткой».

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

К счастью, все они TCP.

Приложение-оболочка должно работать, открывая что-то вроде 6-7 разных сокетов на разных портах, и это плохо для наших сетевых администраторов. Они хотят только один сокет на один порт. Таким образом, все протоколы должны быть в одном канале.

Существует ли чистое Java, готовое решение для мультиплексирования и демультиплексирования множества независимых полнодуплексных потоков в одном и том же сокете TCP , прозрачным и без проблем?

Или есть более простое решение, о котором я забыл?

РЕДАКТИРОВАТЬ: подпотоки независимы, то есть нет возможности тупиковой ситуации, вызванной одним подпотоком, ожидающим некоторого материала, поступающего от другого.

1 Ответ

2 голосов
/ 26 августа 2011

Вы не можете сделать это прозрачным способом по TCP.

Рассмотрим, например, что произойдет, если ваше приложение отправит запрос по одному из «каналов», который зависит от данных, которые ему необходимо получить по другому «каналу». Если сетевые условия отбрасывают достаточно пакетов одного из «каналов», чтобы ваше TCP-соединение зависало (из-за окна TCP) в ожидании ответа, вы фактически блокировали бы все другие «каналы» в том же TCP-соединении, поскольку они совместно то же самое окно, и вы можете попасть в тупик

Этого бы не произошло раньше с каждым каналом в одном и том же окне.

Это может повлиять или не повлиять на ваше конкретное приложение - но может, так что этот метод не прозрачен. Вы можете попробовать использовать SCTP для преодоления этого, если это возможно

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