我正在向服务器发送大量数据。现在,当我发送数据并等待服务器响应时,突然我的android设备失去了互联网连接。
因此,我过去经常做的是显示一个连接丢失的警告对话框,但是在服务器端,数据已被处理,并且已在任何URL的某个位置进行了更新。但是我的Android手机不知道这一点,因为它从未得到响应。如何解决。
是否可以在服务器端还是在android本身上完成?
服务器如何知道Android手机不会监听响应?
这可能是客户端-服务器通信优化的观点。
我正在向服务器发送大量数据。现在,当我发送数据并等待服务器响应时,突然我的android设备失去了互联网连接。
因此,我过去经常做的是显示一个连接丢失的警告对话框,但是在服务器端,数据已被处理,并且已在任何URL的某个位置进行了更新。但是我的Android手机不知道这一点,因为它从未得到响应。如何解决。
是否可以在服务器端还是在android本身上完成?
服务器如何知道Android手机不会监听响应?
这可能是客户端-服务器通信优化的观点。
Answers:
对于异步事务,这是一个相当普遍的问题,分为几个部分。
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是适当的响应。
最终结果是,当网络丢失和恢复时,客户端始终可以采取明智的行动,同样,服务器可以始终明智地处理来自客户端的请求
这属于协议通信的基础。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 **/
在上面的示例中,服务器已接受上传的文件,并将#id
ACK响应发送回Android,但Android从未响应ACK。Android设备无法完成握手。由您决定服务器应如何处理。销毁交易,保留交易,并等待Android设备稍后返回或以任何方式完成交易。
服务器可以假定由于设备没有以ACK响应。Android设备未更新其内部状态以指示上传成功。我会放弃交易,并允许设备在将来重复执行。