【问题标题】:Difference between 'connection reset' exception and -1 return value on read when a Java socket is closed关闭 Java 套接字时读取的“连接重置”异常和 -1 返回值之间的区别
【发布时间】:2018-05-18 06:17:57
【问题描述】:

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

大多数时候,当服务器关闭连接时,客户端会在与套接字关联的InputStream 上的读取方法上获得 -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)

有什么区别,为什么?

【问题讨论】:

    标签: java sockets io


    【解决方案1】:

    根据Javadoc的区别是这样的:

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

    java.net.SocketException 扩展了java.io.IOException,所以它会被你的catch-block 捕获。

    【讨论】:

    • “连接重置”不是由创建输入流、关闭的套接字、未连接的套接字或shutdownInput() 引起的。也不依赖于实现。
    猜你喜欢
    • 2013-05-16
    • 1970-01-01
    • 2018-08-31
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 2014-03-01
    • 2023-03-17
    相关资源
    最近更新 更多