将请求发送到服务器并等待响应互联网连接丢失时该怎么办?


14

我正在向服务器发送大量数据。现在,当我发送数据并等待服务器响应时,突然我的android设备失去了互联网连接。
因此,我过去经常做的是显示一个连接丢失的警告对话框,但是在服务器端,数据已被处理,并且已在任何URL的某个位置进行了更新。但是我的Android手机不知道这一点,因为它从未得到响应。如何解决。
是否可以在服务器端还是在android本身上完成?
服务器如何知道Android手机不会监听响应?
这可能是客户端-服务器通信优化的观点。


我们在谈论多少数据?千兆字节?
Daniel Hollinrake

大约7-8 MB左右,但是服务器响应时间太长,并且从手机上传的速率约为128 KB / S。我说的不是数据大小,而是连接问题。
mayank_droid

Answers:


15

对于异步事务,这是一个相当普遍的问题,分为几个部分。

  1. 双方如何知道交易请求已成功收到?
  2. 您如何重新发送客户认为未正确收到的交易请求?
  3. 服务器成功接收到第一个请求后,服务器如何检测到来自客户端的重复请求?
  4. 客户如何知道从何处获得交易结果?

HTTP的伟大之处在于它相当容易解决所有这些问题。

想象这样的URL结构:

POST http://my.server.com/application/engine/queue 
GET   http://my.server.com/application/engine/results?jobid=43425

使用HTTP发布,使用唯一的客户端请求ID向服务器发送请求-并使服务器以作业ID进行响应。从客户端的角度来看,如果未发生此响应,则需要重新发送该请求。从服务器的角度来看,如果客户端发送重复的请求,则需要将客户端请求ID缓存几分钟。只需将相同的作业ID返回给客户端,即可处理重复的请求。

客户端从结果URL获取请求的结果。可以根据需要多次重复此调用以获取结果。如果在结果可用之前调用了它,则响应可能是NO-CONTENT响应,因此客户端知道服务器可以识别作业ID,但尚无内容。如果无法识别作业ID,则NOT-FOUND是适当的响应。

最终结果是,当网络丢失和恢复时,客户端始终可以采取明智的行动,同样,服务器可以始终明智地处理来自客户端的请求


3
那或者简单地做一个简短的请求以获取交易ID,然后几个请求将数据添加到交易中(您可以在此处将传输分成较小的块,以获得部分确认),然后是最终的“提交”请求。然后,对于完全空的事务(客户端很可能没有收到ID),部分上载的事务和结果,您可以具有不同的超时时间(如果客户端未收到结果,则可以重试“提交”请求)。
西蒙·里希特

这样可以解决在传输请求期间丢失连接的情况。所询问的问题是关于发送数据之后但处理请求完成之前的连接丢失。
萧伯纳

1
也可以处理。“提交”事务很小,并且使用事务ID,因此可以廉价地重新发出它,而无需重新传输数据,服务器可以开始处理,也可以返回先前调用的结果。这与您的建议非常相似。区别在于,我有一个单独的请求来创建作业ID,因此我还有一个附加的同步点,因此客户端可以知道该作业是否已经存在而无需重新发送完整的请求。
Simon Richter

是的,那很有意义。
迈克尔·肖

这样,如果事务包含服务器上的部分数据,则我知道存在一个知道此ID并尝试完成该事务的客户端,因此我可以保留部分状态并提议中途恢复传输,从而最大程度地减少了带宽需求并消除了需要比较请求内容以查找重复项。
Simon Richter

4

这属于协议通信的基础。Android客户端已请求交易,并且服务器必须执行交易。如果事务依赖于Android客户端确认,则称为ACK / NAK通信。

ACK(确认)和NAK(否定确认)用于告知另一方请求的结果。

您要问的是客户端和服务器之间的一种握手交换,可以通过基本的ACK / NAK交换来执行。

这是Android通过两种方式上传文件的示例。

Android -> upload files -> Server
Android <- ACK #id <- Server
Android -> ACK #id -> Server

在上面的示例中,我#id为交易添加了唯一标识符。服务器应接收文件,创建交易记录,并将其作为响应发送回Android。然后,Android应确认该交易(或拒绝则为NAK)。

这是一个在握手过程中Android断开连接的示例。

Android -> upload files -> Server
Android <- ACK #id <- Server
/** no ACK response **/

在上面的示例中,服务器已接受上传的文件,并将#idACK响应发送回Android,但Android从未响应ACK。Android设备无法完成握手。由您决定服务器应如何处理。销毁交易,保留交易,并等待Android设备稍后返回或以任何方式完成交易。

服务器可以假定由于设备没有以ACK响应。Android设备未更新其内部状态以指示上传成功。我会放弃交易,并允许设备在将来重复执行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.