Java在多个服务器端口上侦听客户端尝试连接

Java在多个服务器端口上侦听客户端尝试连接,java,connection,serversocket,asyncsocket,Java,Connection,Serversocket,Asyncsocket,嗯。我觉得自己很笨。我找不到我要找的东西 我正在打开50个ServerSockets并将其添加到ServerSockets列表中: ServerSocket ss = new ServerSocket(getPortNumber()); SOCKETS.add(ss); 我发现每个连接都需要一个新线程: new Thread() { public void run() { ServerSocket ss = new ServerSocket(getPortNumber());

嗯。我觉得自己很笨。我找不到我要找的东西

我正在打开50个ServerSockets并将其添加到ServerSockets列表中:

 ServerSocket ss = new ServerSocket(getPortNumber());
 SOCKETS.add(ss);
我发现每个连接都需要一个新线程:

new Thread() {
public void run() {
    ServerSocket ss = new ServerSocket(getPortNumber());
    while(true) {
        Socket client = ss.accept();
        //handle client
    }
}.start();
所以,我的问题是,在获得连接之前,我是否必须使用while循环

我的意思是,在使用ss.accept分配套接字客户端之前,有没有一种方法可以监听连接尝试

我是否必须使用while循环,直到获得连接

视情况而定。如果您只需要一个连接,则不需要while循环:否则,您需要

我的意思是,在使用ss.accept分配套接字客户端之前,有没有一种方法可以监听连接尝试

这个问题没有意义。这就是accept所做的

注意:创建ServerSocket已将端口置于可连接到的侦听状态。但接受连接的是接受,而不是其他

您正在创建50个侦听端口这一事实已经表明存在严重的设计问题。你只需要一个。不要浪费系统资源


这听起来像是一个XY问题。

我们决定,在我们的案例中,最好为每个客户机配备一个专用的服务器套接字。因此,我现就这项问题答覆如下:


为什么?为什么不是只有一个监听插座?为什么要浪费资源?使用50个插座解决不了任何问题。accept是“监听敲击声”,它不会“在没有传感器尝试连接时使用任何处理时间”。它会阻塞。我不明白你想解决什么问题。您可能正在寻找一个使用NIO和select的非阻塞服务器吗?除非您的规范要求使用50个套接字,否则它不会使用一个。完全按照上面的方法编写循环。让它工作起来。如果你有一个性能问题,这是不可能的,那么你可以考虑NIO,这是工作的十倍。在服务器上使用连接池实际上并不意味着什么,只是每个连接都应该保持,直到从中读取EOS为止。连接池在客户端实现。我建议从硬件规格开始,对您的要求进行一些艰苦的工作。不要再猜测套接字是如何工作的了。我建议你们都阅读Java教程中的自定义网络部分。NB上面的内容是每个ServerSocket有一个新线程。您只需要其中一个,就像您只需要一个ServerSocket一样,但您需要在该循环中为每个接受的套接字创建一个新线程。您是对的。这就是accept所做的。但是要监听多个连接,我需要对每个ServerSocket使用while循环。似乎总有更好的办法。更好的办法为什么?怎样这种方式有什么问题?我刚刚在Java教程的CustomNetworking部分中读到了accept方法。accept方法等待客户端启动并请求在此服务器的主机和端口上建立连接。这消除了一点混乱!举个例子,我把数字调到50。但是现在我知道,如果我需要一个连接池,那么我可以创建一个连接类,在新线程上为每个新连接处理accept方法,并根据需要打开/关闭。谢谢我真的建议你别再猜了。您刚才描述的是用于处理并发客户端的标准服务器端体系结构。它与连接池没有任何关系。连接池是一种客户端技术,用于保存来自每个客户端的连接,例如数据库和LDAP客户端以及web浏览器都使用它。关于服务器端的连接池,您需要做的就是不断读取已接受的连接,直到客户端关闭它,而不是假设只有一个请求/响应对来自它。这只有在您可以重新配置传感器时才能起作用,这在问题或注释中没有说明。我确实告诉过您传感器,这是你知道他们是客户的唯一方法。我给你投票是因为你的信息很有用。然而,我发现自己对你的傲慢有点恼火。你的方式不是唯一的方式,你应该对其他选择持开放态度。我认为没有必要投否决票。