我的服务器上有一个Web服务,它将xml数据推送到通过Internet与之通信的客户端。
特定情况,例如,一旦客户端收到数据,之前 如果通信信道发生故障,则发送确认。
实施例: 如果客户端通过互联网进行软件更新,服务器如何确保每件事情都得到妥善处理。
答案 0 :(得分:2)
如果您想要进入“推送”路径,并且您绝对必须知道更新是否成功,那么您必须以您知道的方式构建服务和客户端。
基本上您需要做的是构建一个小协议,以便无论通信通道的故障如何都能传输信息。这意味着两件事:
例如:
服务推送消息,客户端确认=>一切都很好;
服务推送消息,连接断开,消息丢失。客户端不承认,因为它从未收到消息=>服务稍后会再次推送相同的消息。现在希望你能够了解案例1.
服务推送消息,客户端确认但连接失败且服务未收到确认=>类似于2,因此服务稍后再次推送相同的消息,现在客户端两次收到相同的消息。它必须忽略第二条消息,但仍然需要发送一个确认,这样服务就不会发送第三个,第四个,......第n次;
依此类推......
这是对TCP所做内容的高级描述。 TCP是不可靠网络上的可靠协议。它处理丢包,重复包等。
现在,那将是推动。更简单的替代方案是使用“拉”代替。客户端定期从服务器提取更新。这个实现起来比较简单(如果有效则下载成功,否则你会在以后再试)但是它不是没有它的问题,例如:
依此类推......
问题在于这是一个很大的主题,通用解决方案在特定情况下可能不适用。但这不是一个新话题。其他人以前遇到过这些问题。考虑例如Windows更新,每台PC的操作系统如何更新自身。类似的事情发生在前一段时间,当胖客户端需要更新时。世界变得瘦弱的客户,但现在厚厚的客户正在卷土重来。看看这些问题是如何解决的,你会在网上找到有用的信息。
答案 1 :(得分:0)
我认为没有办法做到这一点。我相信你问的原因是由于以下原因:
1)如果您因为发送大量数据并且客户拒绝接收数据而要求,也许您可以对其进行分页。这样您就可以知道何时访问了最后一页。您甚至可以更进一步,只需在最后一页上放置非常少的数据,这样就可以确保调用最后一页。
2)如果您真的担心确保他们收到整个数据。如何建议他们访问包含数据校验和的第二个Web服务,并建议他们进行比较。
答案 2 :(得分:0)
假设您的网络服务是RESTful,您的服务器应该是无状态的。 客户端应确保它正确接收数据。
您可以定义服务以获取数据的hash value,然后是接收数据本身的请求。客户端可以在下载后检查下载数据的哈希值是否对应于第一次调用所接收的值。
除其他外,您可以在标准Java中使用MD5
,SHA-1
和SHA256
,如Oracle documentation中所述。这将计算服务器端数据的哈希值。
假设您使用来自客户端的Javascript,使用相同的算法(例如jsSHA)计算哈希码有很多种可能性。
我希望它有所帮助。