【问题标题】:Client Server communication in Java - which approach to use?Java 中的客户端服务器通信 - 使用哪种方法?
【发布时间】:2011-02-15 20:50:56
【问题描述】:

我有一个典型的客户端服务器通信 - 客户端向服务器发送数据,服务器处理该数据,并将数据返回给客户端。问题是过程操作可能需要相当长的时间 - 数量级 - 分钟。有几种方法可以用来解决这个问题。

  1. 建立连接并使其保持活动状态,直到操作完成并且客户端收到响应。
  2. 建立连接,发送数据,关闭连接。现在处理发生了,一旦完成,服务器就可以与客户端建立连接以发送数据。
  3. 建立连接,发送数据,关闭连接。进行处理。如果操作完成,客户端每隔 n 分钟/秒询问服务器。如果处理完成,客户端将获取数据。

我想知道哪种方法是最好的使用方法。是否有一些“事实上的”标准来解决这个问题?在 Java 中打开套接字有多“昂贵”?解决方案 1. 对我来说似乎很讨厌,但 2. 和 3. 可以。解决方案 2. 的问题是服务器需要知道客户端正在侦听哪个端口,而解决方案 3. 增加了一些网络开销。

【问题讨论】:

    标签: java networking client-server stream


    【解决方案1】:
    1. 够用了
    2. 在很多情况下都不起作用,例如 wne 客户端在防火墙、NAT 等之下。服务器通常接受来自任何地方的传入连接,桌面通常不接受
    3. 比 1 更好,因为在连接丢失时不会出现问题
    4. 解决方案 1+3 - 建立长时间等待连接,定期休眠并在之后重新连接。我的意思是:连接到服务器,等待 30 秒的数据,如果没有收到数据,休眠 10 秒,循环。

    打开套接字有时很昂贵,但并不像您的数据处理那么昂贵。

    【讨论】:

    • 好吧 4. 解决方案对我不好......我需要尽可能长时间地释放端口 - 我想消耗尽可能少的资源,并减少需要的配置量要完成。我需要有 n 个客户端才能连接到服务器并传入数据进行处理。随着处理的进行,其他客户端应该能够使用相同的端口放入他们的数据进行处理。目前,我认为如果我必须为每个想要连接的客户端配置端口,那将不是一件好事。
    • 为每个用户配置不同端口的原因是什么????对于来自所有客户端的所有连接,只打开一个端口进行监听就足够了。睡眠连接不需要太多资源(当然,如果您使用 NIO)。您可以一次处理十万个并发连接(如果您有足够的 RAM)
    【解决方案2】:

    我看到选项 2 的直接问题。如果客户端在防火墙后面,他很可能被允许连接并执行请求,但可能会阻止服务器连接回客户端。

    正如您所说,选项 1 看起来有点讨厌(虽然不太讨厌,但效果很好),所以在列出的选项中,我会选择选项 3。也许服务器可以估计处理的剩余时间,并在每次民意调查中提示客户何时该回来查看。

    【讨论】:

    • 通知客户还有多少时间可以处理是一个很好的提示——尽管我只能做出非常粗略的估计......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    • 2013-06-13
    • 2014-11-05
    • 1970-01-01
    相关资源
    最近更新 更多