Я видел, что другой ответ сказал, что read()
вернет -1
, когда пир закроется, и write()
выдаст IOException
.
Хотя моя программа запутывает меня:
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.bind(new InetSocketAddress(0));
SocketChannel socket = SocketChannel.open(serverSocketChannel.getLocalAddress());
SocketChannel peer = serverSocketChannel.accept();
peer.close();
int read;
int write;
read = socket.read(ByteBuffer.allocate(1));
System.out.println("read = " + read);
write = socket.write(ByteBuffer.allocate(1));
System.out.println("write = " + write);
Выводит:
read = -1
write = 1
read()
метод возвращает -1
, однако write()
не выдаетисключение.
И я попытался изменить порядок write()
и read()
:
write = socket.write(ByteBuffer.allocate(1));
System.out.println("write = " + write);
read = socket.read(ByteBuffer.allocate(1));
System.out.println("read = " + read);
Вывод:
write = 1
Exception in thread "main" java.io.IOException: An established connection was aborted by the software in your host machine
at sun.nio.ch.SocketDispatcher.read0(Native Method)
at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:43)
at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223)
at sun.nio.ch.IOUtil.read(IOUtil.java:197)
at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:380)
at Core.main(Core.java:76)
Это делаетменя больше смущает: write()
все еще не бросает IOException
, но read()
бросает.
Я удаляю write()
и добавляю еще один read()
:
write = socket.write(ByteBuffer.allocate(1));
System.out.println("write = " + write);
write = socket.write(ByteBuffer.allocate(1));
System.out.println("write = " + write);
Вывод выглядит более странно:
write = 1
Exception in thread "main" java.io.IOException: An established connection
was aborted by the software in your host machine
at sun.nio.ch.SocketDispatcher.write0(Native Method)
at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:51)
at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93)
at sun.nio.ch.IOUtil.write(IOUtil.java:65)
at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:471)
at Core.main(Core.java:76)
Первый write()
не выдает никаких исключений, а второй -.
Я не знаю, является ли результат неопределенным, потому что я не могу найти ничего о пирах в документе.Заранее спасибо!