【问题标题】:Server side socket close detection服务器端套接字关闭检测
【发布时间】:2015-09-14 15:31:14
【问题描述】:

我想通过从客户端 Socket OutputStream (socket.getOutputStream().write(42)) 发送数据来检测服务器端套接字关闭(由 socket.setSoTimeout 关闭)。如果 Socket 在服务器端关闭,这应该会导致异常。但如果我发送数据两次,它只会引发异常:

private boolean sendTest() {
    try {
        System.out.print("connection...");
        socket.getOutputStream().write(42); //Sending "*"
        socket.getOutputStream().write(42); //not working without this line
        System.out.println("ok");
        return true;
    } catch (IOException e) {
        System.out.println("error...disconnecting socket");
        disconnect();
        return false;
    }
}

你如何解释这种行为?

【问题讨论】:

  • socket.getOutputStream().write(42); 无法保证这实际上会发送任何内容。您应该在输出流上调用 flush() 以强制发送数据
  • @ControlAltDel 不起作用...没有异常
  • 这个问题是重复的:stackoverflow.com/questions/151590/…
  • @pmdelatorre 不完全...我想知道为什么只发送第二次数据给我一个例外

标签: java sockets outputstream


【解决方案1】:

这里是解释:

您正在向服务器发送第一个字节。服务器得到它,然后关闭套接字。然后,在 THE NEXT WRITE 时,您会收到一个 IOException,因为套接字连接已关闭。

【讨论】:

  • 那么在 SO TIMEOUT 之后服务器不会自行关闭连接?
  • @qwertz1029384756 我不知道如何回答这个问题,因为您还没有发布服务器代码。通常,在 SO TIMEOUT 时,套接字会关闭。通常,如果您在客户端有一个侦听器阻止侦听该连接(即 InputStream.read()),则该线程会以 SocketException 唤醒,表示套接字已关闭。但是您似乎没有在客户端代码中侦听响应。所以下一次你会看到套接字被关闭是你尝试写入它的时候
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-06
  • 2021-04-04
相关资源
最近更新 更多