-1

我们已经开始设计一个 Java 服务器/客户端程序,会有 1 台服务器可能有 100 个客户端,并且客户端可能在另一个国家通过 VPN 连接到服务器,因此网络带宽可能并不理想。典型的用法是,服务器向客户端分派作业,客户端将结果返回给服务器,但是服务器和客户端之间不需要传输太多数据,每个作业可能大约 10s KB,每个作业大约需要 5-在客户端运行 10 分钟。

我们有两种设计方案:

1、客户端在尝试注册服务器时发起socket连接请求,然后我们保留所有的socket连接进行通信。

2、客户端启动socket连接进行注册,然后关闭连接。服务器维护客户端列表,服务器在调度作业时会启动连接,然后关闭。客户端将再次启动连接以报告结果然后关闭。

问题是,就性能和代码复杂性而言,哪个选项会是更好的设计。

4

2 回答 2

0

我做了一个类似的应用程序,我最终决定采用第二种方法,它在连接断开等方面更容易设计和维护。同样使用这种方法,您不需要在服务器上维护 100 个打开的套接字。每次客户端连接时,您都会启动一个新线程来处理它,一旦接收和分派数据,该线程就会终止。

这就是我所做的:

  1. 服务器将侦听一个端口(即 5051)以供客户端注册。我们需要一个随机加密密码,该密码是根据他们连接的日期和时间生成的,当然,这是可选的,取决于您的安全需求。

  2. 客户端将在端口(即 5052)上侦听要处理的作业。他们只接受来自他们注册的同一台服务器(IP 地址)的作业(这也是可选的)

  3. 服务器将在一个端口(即 5053)上侦听客户端以传达结果。它只接受来自注册客户的结果。

就是这样。服务器维护一个注册客户端列表;客户端列表将具有客户端的属性:IP 地址、它们正在侦听的端口号(如果不固定)、它们能够执行的工作类型(如果您需要的话)等。

于 2013-04-26T21:35:05.497 回答
-1

你不会看到很多不同。原因是如果网络在传输 ICMP 数据包(或 TCP SYN/ACK)时遇到问题,整体性能将会很糟糕。

如果没有这样的问题,那么新连接设置的开销可以忽略不计。即使新连接需要 15 秒(这真的很糟糕),总时间损失将是:

100% * 15 sec / 10 min * 60 sec = 2,5%

但是如果很少的小数据包需要 15 秒,那么即使使用现有的连接也不会给您带来好处。

另一个方面,是安全性。如果您有一个安全协议,它使用某种 SSL(或其他协商)来验证客户端身份等,那么保持连接可能是值得的。

然而,在 Internet(不是本地网络)上保持长连接是一件非常不可靠的事情。所以你可以尝试使用组合方法:尝试保持连接,但如果它死了(或当它死了),重新连接/恢复。

于 2013-04-26T19:12:11.437 回答