Aug 14, 2012 16:35
Оказывается, что сокеты в Java пригодны для нормальной работы только в одностороннем режиме. Потому что, при закрытии потока записис в сокет, разрывается и поток чтения. В результате получаем ситуацию, когда сервер не может остановить чтение приходящей информации, если не знает её размер. Ведь закрытие потока записи со стороны клиента неизбежно приведёт к закрытию сокета, чего клиента никак не устраивает (ведь надо ещё считать с сервера ответ).
Отсюда возникает необходимость всегда указывать размер входящих данных для сервера (аналог content-length в HTTP). Подозреваю, что это не только в Java, но нет сил поднять толстенную книженцию про TCP сокеты, лежащую в корпоративной библиотечке...
В результате, настроил общение с сервером по двум сокетам. В одном отсылаю данные и режу коннект по окончанию, а в другом считываю ответ. Благо работа с сервером идёт в однопоточном режиме, что позволяет безопасно реализовать такой "фокус".
linux,
java,
работа