A SocketChannel
в результате ServerSocketChannel.accept()
подключено . Этого не может быть. Тест isConnected()
бессмыслен.
Ваш код ввода / вывода на сервере неверен. Записью канала должен предшествовать buffer.flip()
, а затем buffer.compact().
Канонический способ копирования с одного канала на другой заключается в следующем (обратите внимание, что это работает правильно в EOS, даже если в буфере все еще находятся ожидающие данные):
while (in.read(buffer) >= 0 || buffer.position() > 0)
{
buffer.flip();
out.write(buffer);
buffer.compact();
}
Подобно моему первому абзацу, SocketChannel
, полученный в результате SocketChannel.open()
, за которым следует SocketChannel.connect()
, подключен : опять же, тест не имеет смысла. Если бы он не был подключен, на вызове connect()
был бы ConnectException
.
Ваш код ввода / вывода клиента имеет те же проблемы, что и код ввода / вывода вашего сервера.
Вы не закрываете SocketChannel
на сервере, поэтому клиент никогда не прекратит чтение из соединения.
Вы также не закрываете SocketChannel
в клиенте.
Тест File.exists()
не имеет смысла. Следующая строка выдаст исключение, если файла там нет, и вы все равно должны обработать это исключение, так зачем делать все это снова?