【问题标题】:How to correctly close the socket?如何正确关闭套接字?
【发布时间】:2014-05-19 12:08:17
【问题描述】:

客户:

打开套接字:

Socket socket = new Socket(host,port);

写入数据:

socket.getOutputStream().write("str");
socket.getOutputStream().flush();

读取数据:

response = socket.getInputStream().read();

关闭连接和套接字:

socket.shutdownInput();
socket.shutdownOutput();
socket.close();

服务器:

Socket clientSocket = serverSocket.accept();
message = clientSocket.getInputStream().read();
clientSocket.getOutputStream().write("str2");

clientSocket.isConnected() 返回true,服务器看不到客户端断开连接。如何检测客户端断开连接?

我正在尝试使用这个:

try {
     while (true) {
           message = clientSocket.getInputStream().read();
           clientSocket.getOutputStream().write("str2");
     }
} catch (IOException e) {
     clientSocket.close();
}

但它不起作用。

【问题讨论】:

  • Related questions 讨论如何检测套接字已关闭(或者实际上为什么无法可靠检测)。

标签: java sockets client-server


【解决方案1】:

一种常见的方法是客户端向服务器发送“QUIT”消息。然后服务器将关闭它的套接字。

另一种方法是在服务器套接字上执行 I/O 并捕获客户端离开时将出现的异常。

后一种方法有几个缺点:

  • 服务器需要一段时间才能放弃尝试访问客户端(这可能需要 2 分钟)
  • 错误消息可能并不总是相同。通常,您只会收到来自操作系统的错误消息SocketException

【讨论】:

    猜你喜欢
    • 2012-02-10
    • 2018-07-27
    • 2020-03-20
    • 2018-12-14
    • 2016-05-25
    • 1970-01-01
    • 2014-04-13
    • 2012-09-25
    • 1970-01-01
    相关资源
    最近更新 更多