【发布时间】:2017-01-05 18:28:31
【问题描述】:
我和我的同事正在开发一个与 Web 服务通信以处理一些事务数据的客户端应用程序。这些是我们沟通的步骤:
- 客户端应用程序发起连接并发送请求消息 (
timestamp = T1) - Web 服务接受连接并处理请求 (
timestamp ≈ T1) - Web 服务返回响应消息 (
timestamp = T1 + few_seconds) - Web 服务关闭连接 (
timestamp = T1 + 3_minutes) - 客户端应用程序获取响应消息并继续进行数据解析 (
timestamp = T1 + 3_minutes)
我们的问题在于时间戳引用: Web 服务处理请求并几乎立即检索响应,但客户端应用程序在服务器关闭连接之前不会收到响应消息。以下是日志文件:
客户端应用日志sn-p:
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服务的实现,有没有办法在服务发起响应时立即在客户端获取响应消息(然后由客户端关闭连接)?提前致谢。
【问题讨论】:
-
您可能想尝试使用 DataFetcher,添加 FetcherListener 并侦听 gotMore(...) 问题可能是您的 BufferedReader.readLine() 正在等待新行并且没有通知你的传入数据。 sourceforge.net/p/tus/code/HEAD/tree/tjacobs/io/…
-
究竟使用了什么协议?消息的结尾是如何分隔的?检测消息结束的客户端代码在哪里?您如何期望客户端代码知道它何时收到消息? (连接关闭时除外,因为这似乎不是您想要的。)
标签: java sockets tcp network-programming client-server