'连接重置'之间的区别Java套接字关闭时读取的异常和-1返回值

时间:2017-12-04 17:53:37

标签: java sockets io

我有一个Java套接字连接到服务器并从该服务器接收一系列缓冲区。当服务器关闭连接时传输停止,即关闭其侧面的接受套接字。

大多数情况下,当服务器关闭连接时,客户端在与套接字关联的InputStream上的read方法上获得-1返回码:

Socket sSocket   = new Socket(ServerAddress ,acceptorPort);
InputStream  isr = sSocket.getInputStream();

byte[] buf              = new byte[3200];
int    rr               = 1;

while (rr != -1) {
    try {
        rr     = isr.read(buffer);
    } catch (IOException e) {
        e.printStackTrace();
        break;
    }
}

但有时候read会引发java.net.SocketException: Connection reset。 在这种情况下,我有以下堆栈跟踪:

java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:210)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at java.net.SocketInputStream.read(SocketInputStream.java:127)
at com.testing.sockets.SimpleReadTest.main(SimpleReadTest.java:149)

有什么区别和原因?

1 个答案:

答案 0 :(得分:-1)

根据Javadoc的差异是:

  • -1如果没有更多数据,因为已到达流的末尾。
  • java.net.IOException - 如果发生I / O错误。

java.net.SocketException扩展了java.io.IOException,因此被catch阻止了。