繁体   English   中英

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

[英]make sure `response.getOutputStream().write()` was received

我以以下方式编写对HTTP请求的response.getOutputStream().write()response.getOutputStream().write()

我想确保客户收到了它。

由于TCP发送确认,因此它必须是可能的。

这个要求还意味着写操作必须是阻塞操作(对我来说很好!)。

因此,我如何知道是否以上述方式完成(我怀疑不是这样)? 有保证的规格吗? 有什么办法做到这一点? 我在使用Tomcat 6。

... PS,我的意思是除了让客户端在另一个HTTP请求中发送此确认之外,还有其他方法:)

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

response.getOutputStream().flush();

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

简而言之,如果您可以编写但不会出错,则您的客户端确实收到了数据。 至少在TCP堆栈上。 客户显然负责消费消息。

TCP同时提供数据完整性和交付保证。 它将一直重新传输,直到接收器确认接收到数据包为止。 但是所有这些都发生在TCP堆栈内部。 您的代码可以假设它发生了,或者您收到了错误。 仅这两种情况是可能的。

另外,您可能要确保关闭输出流,否则客户端可能坐在那里缓冲数据,直到它接收到流的结束。

我希望这有帮助

TCP仅知道对等方已接收到数据。 它不知道对等应用程序已接收到数据。 由于TCP写入是异步的,因此可以在写入或刷新返回到发送应用程序后很长时间检测到错误。

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

我建议您查找“两军问题”。

相反,您应该做的是使交易成为幂等 (查找),然后客户有责任确保交易发生。 如果客户没有得到回应,他应该只重复交易。 对重试次数设置一个较低的限制,例如两次或三次。

您确定那是您想要的吗? 测试写入是否成功? TCP旨在确保其正常工作,如果数据包失败,您将开始断开连接和IOExeceptions。 实际上,您将获得RunTimeException。 这样做的方法是将响应发送回源。 然后等待响应出现。

当您等待时,请确保您等待了一段时间并放弃,以免您挂死。

假设您只想调试代码。 如果要调试,请使用诸如ethereal之类的数据包嗅探器。 相信我,一旦您掌握正确的逻辑,就不需要ack数据包了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM