服务器设计:发送UDP数据包进行SSLTCP唤醒?

时间:2013-01-15 03:01:15

标签: ssl tcp udp

我有一台服务器,它会在每分钟为每个安全连接的客户端创建一个新线程。如果我使用线程池,这意味着我将同时拥有有限数量的客户端。但是,这意味着我无法监听所有客户端的端口。

我的想法是让客户端发送一个UDP数据包,其中一些ID链接到那个连接,这样他们就可以重新建立连接而不是锁定一个线程10-60秒(服务器会将SSLsockets保留在内存中) 。 这是解决问题的好方法吗? - 我没有看到任何安全漏洞。

服务器是java,客户端是C ++,不会影响问题。

2 个答案:

答案 0 :(得分:1)

如果您说的唯一端口是TCP / 443(HTTPS)怎么办?如果UDP是防火墙(非常可能)怎么办?换句话说,你不应该在这张图片中引入UDP。

即使在线程池场景中,您仍然可以知道连接到同一服务器端口的多个客户端之间的区别。

这方面的典型解决方案是创建一组您将要一次关注的套接字(在一个线程中) - 在C / C ++中,它通常使用select() / poll() / {来完成{1}},在Java中,您可以使用epoll()

这样,如果任何客户端有什么要说服务器,那么您的java.nio循环会立即注意到,为这些客户端提供服务并返回select,这非常消耗很少(实际上是0)CPU使用率。

这是一个如何执行select loop in C和类似示例in Java的示例。

答案 1 :(得分:1)

你的问题没有意义。如果客户端要重新连接,则应该只打开一个新套接字。你正在假设至少有一个额外的线程来监听UDP端口然后......什么?它仍然必须使用线程池来处理该客户端,如果这是你自己施加的约束,或者启动一个新线程,在这种情况下你可能不会首先有线程池约束。

  

然而,这意味着我无法监听所有客户端的端口。

不,不。这只是意味着一些客户端在线程池已满时将获得延迟服务,并且在积压队列已满时,极少数客户端将获得连接失败。它根本不会影响你监听的能力。