Полнодуплексное TCP соединение без NIO невозможно? - PullRequest
2 голосов
/ 21 января 2010

У меня есть два отдельных процесса Java, взаимодействующих через одно соединение TCP. Протокол не простой синхронный запрос / ответ, такой как HTTP. Обе стороны могут самостоятельно инициировать запросы и отправлять данные. Я хочу реализовать это, используя потоки и блокируя сокеты, избегая NIO. Но возможно ли это вообще?

Java-сокеты (java.net.Socket) не являются потокобезопасными, поэтому я не могу читать из сокета в одном потоке, одновременно записывая в него в другом потоке (Это правда?) Это ограничение, очевидно, приводит к возможности тупиковой ситуации, когда обе стороны блокируют запись в сокет.

Из этого следует, что некоторые протоколы поверх TCP не могут быть реализованы в Java без использования NIO, или я упускаю точку?

Спасибо.

Ответы [ 3 ]

4 голосов
/ 21 января 2010

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

Если вы можете указать на некоторую документацию, которая предполагает, что сокеты не являются полнодуплексными, я попытаюсь уточнить это.

1 голос
/ 21 января 2010

Я не знаю, где вы читали, что сокеты Java, как правило, небезопасны. Вы не можете иметь несколько потоков, одновременно записывающих или читающих из потоков сокета, но нет никаких причин, по которым вы не можете иметь запись в потоке в OutputStream сокета и в другой поток, читающий из InputStream сокета.

0 голосов
/ 21 января 2010

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

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