确保收到`response.getOutputStream()。write()`

时间:2012-08-06 01:26:51

标签: java http networking tcp

我以下列方式写入对HTTP请求的响应: response.getOutputStream().write()

我想确保客户收到它。

必须可以,因为TCP发送确认。

这个要求也意味着写必须是一个阻塞操作(我没问题!)。

那我怎么知道它是否以上述方式完成(我怀疑它不是)?保证它的任何规格? 有什么方法可以实现这一目标?我使用Tomcat 6。

... PS,我的意思是除了以外的任何方式使客户端在另一个HTTP请求中发送此确认:)

3 个答案:

答案 0 :(得分:0)

首先,您可以确保刷新输出流缓冲区:

response.getOutputStream().flush();

它保证数据实际发送出去。 TCP将确保它到达,否则将给你的服务器一个错误,这将转换为IOException。

简而言之,如果您可以编写并且没有收到错误,那么您的客户端确实会收到数据。至少在TCP堆栈上。客户显然负责消费该消息。

TCP提供数据完整性和交付保证。它将保持重传,直到接收器确认接收到该数据包。但所有这些都发生在TCP堆栈中。您的代码可以假设它发生了或您收到错误。只有这两种情况是可能的。

此外,您可能希望确保关闭输出流,否则您的客户端可能会在那里缓冲数据,直到收到流结束。

我希望这会有所帮助

答案 1 :(得分:-1)

TCP只知道对等方已收到数据。它不知道对等应用程序已收到数据。并且TCP写入是异步的,因此在写入或刷新返回发送应用程序之后很久就会检测到错误。

应用程序可以通过另一个HTTP事务确认收到,但HTTP应该是无状态的,这样做会违反该规则。

我建议你查看“双军问题”。

您应该做的是让您的交易幂等(查找)然后,客户有责任确保交易发生。如果客户没有得到回复,他应该只重复交易。对重试次数设置一个下限,比如说两次或三次。

答案 2 :(得分:-1)

你确定这是你想要的吗?测试写入是否成功? TCP旨在确保其正常工作,如果数据包出现故障,您将开始断开连接和IOExeceptions。事实上,你会得到RunTimeException。执行此操作的方法是将响应发送回源。等到响应来了。

等待时,请确保等待一段时间并放弃,这样就不会挂起。

假设您只想调试代码。如果你想调试使用像ethereal这样的数据包嗅探器。相信我,一旦你的逻辑正确,你就不需要ack数据包了。

相关问题