|
|
1
17
这对你没有多大帮助,但从技术上讲,你提出的两个解决方案都是错误的。outputstream.flush()和其他任何你能想到的API调用都不能满足你的需要。 确定对等端是否已接收到数据包的唯一可移植且可靠的方法是等待对等端的确认。此确认可以是实际响应,也可以是正常的套接字关闭。故事的结尾——真的没有其他方法,这不是Java特有的——它是基本的网络编程。 如果这不是一个持久的连接——也就是说,如果你只是发送了一些东西然后关闭了连接——你这样做的方式是捕捉所有的IOExceptions(它们中的任何一个都表示一个错误),然后执行一个优雅的套接字关闭:
|
|
|
2
3
在断开连接出现很多问题后,我将代码移动到 使用增强格式 ,这几乎意味着您将包更改为类似于S:。
这样,如果发生错误,苹果不会断开连接,但会将反馈代码写入插座。 ,这意味着您将包更改为如下所示:
这样,如果发生错误,苹果就不会断开连接,而是将反馈代码写入插座。 |
|
|
3
2
如果你使用TCP/IP协议向苹果发送信息,你必须得到确认。不管你怎么说:
你这是什么意思?TCP/IP保证交付,因此接收方必须确认收到。但是,它不能保证何时交货。 如果您在收到ACK之前向苹果发送通知,并断开连接,则无法判断您是否成功,因此您只需再次发送即可。如果两次推送相同的信息是一个问题,或者设备没有正确处理,则存在问题。解决方案是修复重复推送通知的设备处理:推送端没有任何操作。 @意见澄清/问题 好啊。你理解的第一部分是你对第二部分的回答。只有接收到ACK的数据包才被正确地发送和接收。我相信我们可以考虑一些非常复杂的方案来跟踪每个单独的包,但是TCP应该将这个层抽象出来并为您处理它。在您的末尾,您只需处理可能发生的大量失败(如果出现任何异常,则在Java中)。如果没有例外,您刚才尝试发送的数据将由TCP/IP协议保证发送。 是否存在这样一种情况,即数据看起来是“发送”的,但不保证在不引发异常的情况下被接收?答案应该是否定的。 @实例 很好的例子,这说明了很多事情。我本以为会出差错的。在发布的示例中,第二次写入时抛出了一个错误,但不是第一次写入。这是有趣的行为…我找不到太多的信息来解释它为什么会这样。但是,它解释了为什么我们必须开发自己的应用程序级协议来验证交付。 看起来你是正确的,如果没有协议确认他们不能保证苹果设备会收到通知。苹果也只排队等候最后一条消息。稍微看一下服务,我可以确定这个服务更方便客户,但不能用来保证服务,必须与其他方法结合。我从下面的资料中读到这个。 似乎答案不在于你是否能确定地分辨出来。您可以使用类似wireshark的包嗅探器来判断它是否被发送了,但是由于服务的性质,这仍然不能保证它被接收并发送到设备。 |