我有一个服务器,它会为每个安全连接的客户端创建一个新线程。如果我使用线程池,这意味着我将同时拥有有限数量的客户端。然而,这意味着我不能监听所有客户端的端口。
我的想法是让客户端发送一个带有链接到该连接的 ID 的 UDP 数据包,以便他们可以重新建立连接,而不是将线程锁定 10-60 秒(服务器会将 SSLsockets 保留在内存中)。这是解决问题的好方法吗?- 我没有看到任何安全漏洞。
服务器是java,客户端是C++,这不会影响问题。
你的问题没有意义。如果客户端想要重新连接它应该只打开一个新的套接字。您设置了至少一个额外的线程来监听 UDP 端口,然后......什么?它仍然必须使用线程池来处理该客户端,如果这是您自己施加的约束,或者启动一个新线程,在这种情况下,您可能一开始就没有线程池约束。
然而,这意味着我不能监听所有客户端的端口。
不,它没有。这只是意味着一些客户端会在线程池满时延迟服务,而极少数客户端会在积压队列满时连接失败。它根本不会削弱您倾听客户的能力。
如果您拥有的唯一端口是 TCP/443 (HTTPS),该怎么办?如果 UDP 有防火墙(很有可能)怎么办?换句话说,你不应该在这张图片中引入 UDP。
即使在线程池场景中,您仍然可以知道连接到同一服务器端口的多个客户端之间的区别。
典型的解决方案是创建一组你要立即观察的套接字(在一个线程中)——在 C/C++ 中,它通常使用//select()
来完成,而在 Java 中你可以使用.poll()
epoll()
java.nio
这样,如果任何客户端对作为服务器的您有话要说,您的select
循环将立即注意到,为这些客户端提供服务并返回到select()
,这消耗很少(实际上是 0)CPU 使用率。
这是一个如何在 C 中进行选择循环的示例以及 Java中的类似示例。