代码之家  ›  专栏  ›  技术社区  ›  markovuksanovic

在Java中的客户端-服务器通信-使用哪种方法?

  •  2
  • markovuksanovic  · 技术社区  · 14 年前

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

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

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

    2 回复  |  直到 14 年前
        1
  •  0
  •   aioobe    14 年前

    我看到了选项2的一个直接问题。如果客户机位于防火墙后面,那么很可能会允许他连接并执行请求,但是服务器可能会被阻止重新连接到客户机。

    正如你所说,选项1看起来有点讨厌(虽然不太讨厌,但可以很好地工作),所以在列出的选项中,我会选择选项3。也许服务器可以估计剩下的处理时间,并在每次轮询中提示客户机什么时候该进行检查。

        2
  •  2
  •   Igor Artamonov    14 年前
    1. 很好很好
    2. 在许多情况下都不会工作,例如,owne客户机处于防火墙、NAT等之下。服务器通常接受来自任何地方的传入连接,桌面通常不接受
    3. 比1更好,因为当连接断开时您不会有问题
    4. 解决方案1+3-进行长时间等待连接,定期睡眠,然后重新连接。我的意思是:连接到服务器,等待30秒获取数据,如果没有收到数据,睡眠10秒,循环。

    打开套接字有时很昂贵,但并不贵到数据处理。