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

标签 java networking client-server stream

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

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

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

最佳答案

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

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

关于java - Java 中的客户端服务器通信 - 使用哪种方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2772284/

相关文章:

java - 如何使 Java GUI 与 Core 完全分离

java - 从 Android 设备向 Android Things 发送命令

sockets - 127.0.0.1 和 localhost 有什么区别

python - 从网络服务器连接到树莓派

c# - 多个客户端在服务器上调用函数 : Isolate each client calls

java - 如果我在 if 语句中检查方法是否返回 true,则方法中的实际代码会被执行吗?

java - 如何解决android中系统资源中的图像

sockets - "Connectionless, unconnected"连接

C# tcp server-client,无法发送消息

java - 检查帐户是否已存在时出现空指针异常 - Spring+Thymeleaf