Поддерживают ли сокеты Java полный дуплекс? - PullRequest
52 голосов
/ 07 июня 2011

Возможно ли, чтобы один поток записывал в OutputStream Java Socket, в то время как другой считывал из сокета InputStream без необходимости синхронизации потоков в сокете?

Ответы [ 2 ]

46 голосов
/ 07 июня 2011

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

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

Поскольку входной поток и выходной поток являются отдельными объектами в Socket, единственное, что вас может беспокоить, это то, что происходит, если у вас есть два потока, пытающихся читать или записывать (двапотоки, тот же поток ввода / вывода) в то же время?Методы чтения / записи классов InputStream / OutputStream не синхронизированы.Однако возможно, что если вы используете подкласс InputStream / OutputStream, то методы чтения / записи, которые вы вызываете, синхронизируются.Вы можете проверить javadoc для любого класса / методов, которые вы вызываете, и выяснить это довольно быстро.

9 голосов
/ 07 июня 2011

Да, это безопасно.

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

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