【问题标题】:How to stop a method until I get the response in java?如何停止方法,直到我在 java 中得到响应?
【发布时间】:2026-01-26 03:45:01
【问题描述】:

我编写了一个简单的 TCP Server 程序,用于接收来自客户端的数据。我的 main() 方法如下所示:

Acceptor acceptor = Acceptor.open(new InetSocketAddress(port));
Session session = acceptor.accept(); //accepts connection from client and returns session object
FIXSession transport = session.getTransport();
String str = transport.receive(); // receives data from client

doWork(str); // do the remaining process.

在上面的代码中,我尝试使用“transport.receive()”方法从客户端接收数据。如果假设客户端需要一些时间来发送数据,同时我的主程序将进入下一步“doWork(str);”结果为空。如何让 main() 线程等到我从客户端收到数据。将来我可能会在其他线程中运行 doWork(str) 方法。所以我需要让 doWork(str) 线程等到我从客户端获取数据。有什么办法吗?

【问题讨论】:

  • 您需要提供有关您的代码的更多信息。接收方法的代码是什么?
  • 如果您使用的是 API,我正在查看“项目:费城”transport.receive 返回字节数。看起来你需要设置一个消息监听器。
  • 是的,我正在使用费城。即使它返回字节数,如果接收到的字节数小于0,那么它必须等到接收到的字节数大于0。但它只是跳转到下一步。我希望它等到客户端将数据发送到服务器。也就是说接收到的字节数应该大于零。
  • 实际上receive函数只返回str。我修改了源代码以返回一个字符串。我没有在我的代码中检查你的过程。我明天会做的。然后我可以投票给你的答案。到目前为止,您的答案最适合我。谢谢
  • 好吧,至少我在FIXSession 看到的不是这个。此方法返回一个 int,而不是字符串。也许你应该澄清你的问题并指出你正在使用的那个库的确切版本。

标签: java multithreading client-server nio


【解决方案1】:

引用 OP:

即使返回字节数,如果接收到的字节数小于0,则必须等到接收到的字节数大于0

因此,将其转换为阻塞调用的直接方法:

int numBytes = transport.receive();
while (numBytes == 0) {
  Thread.sleep(SOME_TIME);
  numBytes = transport.receive();
}

例如。如果您希望代码等待;然后编写等待的代码。但是,当然,这仍然没有回答如何实际接收消息。因为这个想法是你需要一个MessageListener 来实际接收消息。

【讨论】:

  • 这个 API 肯定有阻塞 I/O 吗?睡在网络代码中对上帝来说是可憎的。
最近更新 更多