Как узнать, если другая сторона SocketChannel закрыта? - PullRequest
0 голосов
/ 04 октября 2018

Я видел, что другой ответ сказал, что 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() не выдает никаких исключений, а второй -.


Я не знаю, является ли результат неопределенным, потому что я не могу найти ничего о пирах в документе.Заранее спасибо!

...