【问题标题】:Java TCP Connection From Server through Client从服务器到客户端的 Java TCP 连接
【发布时间】:2016-09-27 13:18:55
【问题描述】:

服务器如何通过之前连接到服务器的客户端打开 TCP 连接?假设我们有如下代码所示的简单服务器;服务器等待客户端连接,处理程序线程为连接的客户端提供服务。客户端如下,每次想和服务器做一个操作,重新建立连接,与服务器通信然后关闭连接。那么,如果服务器想通过客户端打开 TCP 连接(当客户端与服务器之间没有活动连接时),该怎么做呢?

服务器代码

public class DServer {
    public static void main(String[] args) {
        ServerSocket serverSocket = new ServerSocket(7800);
        while(true) {
            Socket socket = serverSocket.accept();
            System.out.println("Server established a new connection");
            HandleConnection handler = new HandleConnection(socket);
            handler.start();
        }
    }
}

客户代码

public class DClient{
    public static void main(String[] args) {
        Socket socket = new Socket("localhost", 7800);
        ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
        ObjectInputStream in = new ObjectInputStream(socket.getInputStream());

        //for every operation you do, first reestablish the connection,
        //communicate with server, then close the connection.

    }
}

【问题讨论】:

    标签: java sockets tcp client-server


    【解决方案1】:

    我认为您对什么是客户端以及什么是网络意义上的服务器存在一些基本的误解。

    服务器是监听连接的应用程序。客户端是创建与服务器的连接的应用程序。如果您希望两个应用程序都能够随意发起通信,那么您的应用程序需要既是客户端又是服务器。

    因此,您的“DClient”应用程序需要有一个 ServerSocket。然后,您的“DClient”应用程序可以在“DServer”想要创建连接时通知您的“DServer”应用程序它的主机和端口(请注意,如果两个应用程序不在同一个网络中,NATing 之类的事情可能会使此类事情出现问题)。

    或者,根据您的用例,您可以只保留从客户端到服务器的连接。这是让服务器推送数据的更常用方法。

    【讨论】:

    • 感谢您的解释。我没有误解客户端-服务器范式,但我有一个作业问题要求我以这种方式实现它。正如你所说,我很难在客户端上打开服务器套接字,但对我来说似乎效率低下(当有很多客户端时)并且想了解是否真的有另一种方法。
    【解决方案2】:

    有一种解决方案可以创建代理服务器,该服务器管理请求客户端和服务器,该服务器为两个客户端请求调用中间件。 在网络编程中,由于客户端服务器架构,必须先启动服务器,然后再请求客户端。

    【讨论】:

    • 但是已经有一个java库了?我的意思是创建代理服务器。
    猜你喜欢
    • 1970-01-01
    • 2021-08-12
    • 2022-01-16
    • 2019-06-06
    • 2019-06-18
    • 2017-02-24
    • 1970-01-01
    • 2017-06-20
    • 1970-01-01
    相关资源
    最近更新 更多