[英]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.