socket的封装
通过前面的socke通信(一),socket就是基于TCP/IP协议进行数据传输的, 基尽管实现大致比较步骤比较简单,server: 创建->绑定端口->接收->阻塞->读/写->断开,client:创建-> 连接->读/写->断开。但是在实际使用过程中我们的数据格式,大小,和网络信号稳定,物理传输媒介的影响,以及客户端和服务器的负载等各方的因数都影响者socket。因此单靠写一个基础的socket公信程序是无法满足正常的生产需要。
- 在实际的使用过程中,我们需要考虑到数据的丢包,重复,缓冲区的溢出,数据格式编码和解码,网络异常断开,数据传输超时,接收和发送数据后的结果回调,数据的分段处理,如果是服务器,我们还需要考虑三方的Dos攻击等。稍有不慎,可能就会出现异常崩溃。
- 实际开发中,为了节省开发效率,iOS一般采用的AsyncSocket三方开源框架,它为我们已经封装好了底层需要的差错处理,以及数据流的输入和读取操作,闭关通过代理方法对接口进行的简化,大大提高开发效率。同时也支持UDP和TCP传输。
-
基本的AsyncSocket具体实现方式如下,网上有很多的代码这里就不一一细说了。
Snip20161204_10.png
基于socket的文件分段上传
-
首先我们需要和服务器端达成一致,约定文件上传的格式,其中至少包括文件的唯一识别码,文件总长,格式类型,起始位置,如果涉及到编码和解码,还需要指定对应的边解码格式。
-
然后在socket管道建立连接的时候,我们需要对文件参数进行初始化,并通过文件句丙指针和对应的文件长度对其进行分段后传输。
-
在接受到服务器端响应后,将数据转换成对应的格式(最好是通用的json),然后根据服务器的offset偏移量,对文件进行重新分段后上传,直至上传完成,中间若有失败则判定是否超时或者错误次数超上限,根据实际需要通过 回到block, success,failure,progress实时回调上传进度。
-
需要注意的是,在实际使用过程中需要注意,使用AsyncSocket创建的对象必须保持一个引用,否则socket对象被释放,将会导致连接断开。
-
如果我门需要同时支持使用多个文件上传,AsyncSocket也未我门提供了tag值,对上传的不同文件指定不同的tag值和回调block。在每次接受到数据的时候再进行tag值判定后回调和上传及可。
-
实现代码, 每个公司定义的字段的传输方式也不一样,只要弄懂了实现思路,写起来也花不了多长时间。
以上只是本人最近项目中用到的文件分段做法,大家若有什么新的实现方案获思路,欢迎点评,谢谢。
网友评论