Возможно ли, что запись в Java-сокет происходит без одновременного чтения? - PullRequest
2 голосов
/ 03 декабря 2010

Допустим, у меня есть два потока, один для чтения и один для отправки; если запись не удалась, операция чтения в другом потоке тоже всегда будет неудачной?

Я думаю, что есть хотя бы один случай, когда этого не произойдет (InterruptedIOException, если отправка потока прервана), но есть ли другой? Если да, относятся ли некоторые из этих случаев к проблемам с сетью?

Ответы [ 3 ]

1 голос
/ 04 декабря 2010

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

0 голосов
/ 03 декабря 2010

Полагаю, это действительно зависит от вашей ситуации. Вероятно, наиболее распространенная ситуация - закрытие соединения, что означает, что чтение и запись не удастся. Однако это не обязательно так. У вас может быть какая-то странная настройка брандмауэра, которая позволяет вам читать, но не писать.

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

0 голосов
/ 03 декабря 2010

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

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

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