java - 如何在Java中关闭来自服务器的TCP连接

标签 java tcp server

这是我需要用 Java 实现的用例:

  1. 服务器正在监听来自某些客户端的推送消息
  2. 如果客户端有一些数据要推送到服务器,它会打开 TCP 连接并发送所有消息
  3. 当客户端发送最后一条消息(表示这是最后一条消息的特殊消息)时,服务器应通过启动 TCP 关闭握手来关闭连接

我在最后一步中遇到问题,因为我不知道如何关闭来自服务器站点的连接。我当前的代码如下。如何从服务器站点发起连接关闭 TCP 握手?感谢您的帮助。

public class Server{

public static void main(String[] args) throws Exception {

    while (true) {
        int port = AppConfig.getInstance().getPort();

        try (ServerSocket socket = new ServerSocket(port)) {
            Socket server = socket.accept();

            InetAddress ipAddress = server.getInetAddress();

            MessageHandler handler = new MessageHandler(ipAddress);

            InputStream in = server.getInputStream();

            // reads all bytes from input stream and process them by given handler
            processStream(in, handler);
            in.close();

            server.close();
        } catch (Exception e) {
            LoggingUtils.logException(e);
        }   
    }
}

private static void processStream(InputStream in, MessageHandler handler) throws Exception {
    // implementation is omitted
}

}

最佳答案

你已经做到了。 in.close() 关闭输入流、套接字输出流和套接字。

您真正应该关闭的是连接到套接字的任何输出流,以确保它被刷新,并且您应该在 processStream() 方法中使用保护程序来执行此操作 server .close() 在调用方法的 finally block 中。

NB 你的套接字名称确实是错误的。习惯上使用ServerSocket serverSocket,以及Socket socket = serverSocket.accept()

关于java - 如何在Java中关闭来自服务器的TCP连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45912993/

相关文章:

java - Aviarc 中 aviarc.engine.aviarcData 的默认/故障转移值

java - 如何获取数组中最常见的字符?

nginx - 基于 TCP 负载的动态服务器集的一致性哈希

Python TCP 试图向对象发送一个类似字节的对象是必需的

java - 由于没有互联网连接而无法打开 url 时的 android 事件

java - 如何从字符串中删除一些字符

windows - 为什么 TClientSocket.OnRead 事件会为单个服务器发送两次

c - 发送包含多个数字的字符串 客户端/服务器 TCP

angularjs - 在 Protractor 测试中等待服务器响应(和检查值)

shell - 如何将文件从远程服务器的docker容器复制到本地机器