gpt4 book ai didi

java - 在服务器关闭连接之前,客户端不会收到响应消息(Java)

转载 作者:可可西里 更新时间:2023-11-01 02:44:49 25 4
gpt4 key购买 nike

我和我的同事正在开发一个客户端应用程序,该应用程序与 Web 服务通信以处理一些交易数据。这些是我们沟通的步骤:

  1. 客户端应用发起连接并发送请求消息(timestamp = T1)
  2. Web 服务接受连接并处理请求(timestamp ≈ T1)
  3. Web 服务返回响应消息(timestamp = T1 + few_seconds)
  4. Web 服务关闭连接(timestamp = T1 + 3_minutes)
  5. 客户端应用程序获取响应消息并进行数据解析(timestamp = T1 + 3_minutes)

我们的问题在于时间戳引用:Web 服务几乎立即处理请求并检索响应,但客户端应用程序在服务器关闭连接之前不会收到响应消息。以下是日志文件:

客户端应用程序日志片段:

10:46:25,031 INFO  MessageHandler.java:115 Message sent.
10:49:25,071 INFO MessageHandler.java:125 Message received.
10:49:25,103 DEBUG MessageParser.java:67 Message parsed.

服务器应用程序日志:

10:46:25:153 <INFO>   Client connection accepted.
...
10:46:26:602 <INFO> Response message sent.
...
10:49:25:069 <INFO> Closing connection...

如你所见,客户端只有在服务器关闭连接时才会得到响应。

这是完成通信的方法的客户端应用程序代码:

public static String sendMsg(byte[] msg, String serverIp, int port) {
try {
InetAddress address = InetAddress.getByName(serverIp);
Socket socket = new Socket(address, port);
OutputStream os = socket.getOutputStream();

logger.info("Message sent.");

os.write(msg, 0, msg.length);
os.flush();

InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String msgReceived = br.readLine();

logger.info("Message received.");
os.close();
return msgReceived;
} ...(catch blocks) ...
}

假设我们不能改变web服务的实现,有没有办法在服务发起响应时立即在客户端获取响应消息(然后由客户端关闭连接)?提前致谢。

最佳答案

客户端很可能没有正确实现消息协议(protocol)。例如,客户端调用readLine。消息协议(protocol)是否指定消息是?如果不是,readLine 将一直等待,直到连接关闭,仍然尝试获取永远不会发送的那条线。

客户端将无法找到消息的结尾,除非它了解消息是如何定界的。在您的协议(protocol)中如何分隔消息?检测消息结束的客户端代码在哪里?如果您没有编写它,它就不会发生。

关于java - 在服务器关闭连接之前,客户端不会收到响应消息(Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39211079/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com