Java 在多个服务器端口上侦听客户端尝试连接
Posted
技术标签:
【中文标题】Java 在多个服务器端口上侦听客户端尝试连接【英文标题】:Java listening on multiple server ports for client attempt to connect 【发布时间】:2015-09-10 22:37:52 【问题描述】:好的。我觉得很笨。我找不到我要找的东西。
我正在打开 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 分配 Socket 客户端之前,有没有办法监听连接尝试?
【问题讨论】:
为什么?为什么不只有一个监听套接字?为什么要浪费资源? 使用五十个套接字并不能解决任何问题。并且accept()
is '听[ing] for the knock-knock',并且它不会'在没有传感器尝试连接时使用任何处理时间'。它阻塞。我不明白你想在这里解决什么。您是否正在寻找带有 NIO 和 select()
的非阻塞服务器?
除非您的规范要求使用 50 个套接字,但它不会使用一个。完全按照上面的方式编写循环。让它工作。如果你然后有性能问题,这不太可能,你可以考虑 NIO,它的工作量是十倍。在服务器上使用连接池并没有任何意义,只是每个连接都应该保持到从它读取 EOS 之前。连接池在客户端实现。我建议对您的要求进行一些艰苦的工作,从硬件的规格开始。无需再猜测套接字的工作原理。
我建议你们都阅读 Java 教程的自定义网络部分。
NB 你上面有一个新线程per ServerSocket
。你只需要其中一个,因为你只需要一个ServerSocket
,但你需要创建一个新线程 per 接受了 Socket
,inside 该循环。
【参考方案1】:
在获得连接之前是否必须使用 while 循环?
这取决于。如果您只期望一个连接,则不需要 while 循环:否则,您需要。
我的意思是,在使用 ss.accept 分配 Socket 客户端之前,有没有办法监听连接尝试?
这个问题没有意义。这就是accept()
所做的。
NB 创建ServerSocket
已经将端口置于可以连接的侦听状态。但接受连接的是accept()
,仅此而已。
创建 50 个监听端口这一事实已经表明存在严重的设计问题。你只需要一个。不要浪费系统资源。
这听起来像是一个 XY 问题。
【讨论】:
你是对的。这就是 accept() 所做的。但是要监听多个连接,我需要对每个 ServerSocket 使用 while 循环。似乎必须有更好的方法。 更好的方法为什么?如何?这种方式有什么问题? 我刚刚在 Java 教程的自定义网络部分中阅读了有关接受方法的内容。 “accept 方法一直等到客户端启动并请求在此服务器的主机和端口上建立连接。”这消除了一些混乱!我拿了 50 号只是为了举例。但是现在我知道,如果我需要一个连接池,那么我可以创建一个 Connection 类,该类处理每个新连接的新线程上的接受方法,并根据需要打开/关闭。谢谢! 我真的建议你停止猜测。您刚才描述的是用于处理并发客户端的标准服务器端架构。它与连接池化没有任何关系。 连接池化是一种客户端技术,用于保存来自每个客户端的连接,和它用于例如通过数据库和 LDAP 客户端以及 Web 浏览器。对于服务器端的连接池,您需要做的就是不断读取已接受的连接,直到客户端关闭它,而不是假设只有一个请求/响应对来自它。【参考方案2】:我们决定(在我们的例子中)最好为每个客户端都有一个专用的服务器套接字。因此,我正在关注这个 SO 问题的答案:
Server Listening on Multiple Ports [Java]
【讨论】:
只有在您可以重新配置问题中未说明的传感器或 cmets 时才能使用。 我确实告诉过您有关传感器的信息,这是您知道它们是客户的唯一方法。我给了你赞成票,因为你的信息很有帮助。但是,我发现自己对你的傲慢感到有些恼火。你的方式不是唯一的方式,你应该对替代方案持开放态度。我认为没有必要投反对票。以上是关于Java 在多个服务器端口上侦听客户端尝试连接的主要内容,如果未能解决你的问题,请参考以下文章