关于Socket阻塞和非阻塞的问题
都知道Sokcet阻塞情况下,发送数据需要得到返回值才会继续接下来的操作,而非阻塞发送完数据之后不需要得到返回值,接着做接下来的操作,现在有个问题,如下,
比如说我向服务器发送一个文件,如果文件发送成功,我就删除掉本地的文件,如果失败就不做操作,接下来就是问题所在了。
情况1:如果我使用阻塞式,发送文件之后,我会等待一个返回值,如果成功就删除本地数据,失败不做操作。但会遇到一种情况,可能因为网络问题,发送文件之后,可能一直没有得到返回值,哪么我的程序就会一直处于等待的时间,这里就很尴尬。
情况2:如果我使用非阻塞式,这里我有个问题,因为我需要得到返回值才能知道服务器有没有接收成功,再对本地的文件做删除操作,有没有一种可能,我发送数据之后,发送成功了,但没有返回值,这是我不解的,
路过的都给点建议吧,
socket 数据 服务器 网络
[解决办法]
设置 timeout
[解决办法]
显然 timeout也是无法确保的!
最好服务端成功接收后,回复发送端一个ack,待发送端收到ack后再作删除操作!
如果在一段时间内没有接收到ack的话,则认为是失败的,重新给服务端发送文件!
[解决办法]
要是我来设计这个功能,我会这么做。
设计三个API,一个是上传,可以没有返回值,也可以有返回值;一个是查询服务器端的文件的状态(大小,checksum等);一个是删除本地文件。
然后流程就是:
upload_file_to_server
checksum = query_file_on_server
if checksum == local_checksum
delete_local_file
else
// retry or something
[解决办法]
发送数据之后,发送成功了,但没有返回值
----这种情况,可以设置一个timeout呀
[解决办法]