美文网首页
SOCKET 和 AFNet

SOCKET 和 AFNet

作者: 健健锅 | 来源:发表于2019-01-11 16:09 被阅读11次

/*
IM常遇见的问题
长连接
IM保证数据准确传输
如何保证IM实时消息的“时序性”与“一致性”?
websocket 和socket的区别
链接:https://www.zhihu.com/question/29637351/answer/534704474
来源:知乎
https://yunxin.163.com/dev-blog?from=zhihu&utm_source=zhihu&utm_medium=ques&utm_campaign=seo&utm_content=video-ques
网易云

 socket是位于传输层的网络编程了,一般用于需要自己定义应用层的协议的应用程序,如果已经有了成熟的应用层协议,比如http等,
 
 其中的传输层就是 TCP/IP 所在的地方,而你平时通过代码编写的应用程序大多属于应用层范畴,socket 在这里起到就是连接应用层与传输层的作用。socket 的诞生是为了应用程序能够更方便的将数据经由传输层来传输,所以它本质上就是对 TCP/IP 的运用进行了一层封装,然后应用程序直接调用 socket API 即可进行通信。那么它是如何工作的呢?它分为 2 个部分,服务端需要建立 socket 来监听指定的地址,然后等待客户端来连接。而客户端则需要建立 socket 并与服务端的 socket 地址进行连接。
 
 作者:网易云信
 //聊天室介绍
 https://zhuanlan.zhihu.com/p/24475299
 LCSStudioSocketController >>  LCSAsyncSocket
 1. 通过HTTP 请求 获取 socket 需要的 host(域名或ip) 和 port(端口号8080)
 2.初始化socket抽象类,默认端口赋值 然后socket 懒加载初始化 异步线程 链接socket
    代理方法f收到回调 socket 链接成功, 这时候在代理方法中 进行身份验证(将用户的个人信息发送过去),
     身份验证过程:
               身份信息(从字典>string > nsdata)转换成nsdata, 准换成 byte类型,获取内容长度,
               NSData.length + 首部.length  得到分包的长度
               然后把包首 结构体 + n数据内容  拼接成完整的 NSData包数据
                 包首 如下
                 SocketHeader header = {
                                 CFSwapInt32HostToBig(packLen), //包的长度
                                 CFSwapInt16HostToBig([self headerLength]),//包首的长度
                                 CFSwapInt16HostToBig(LCS_VERSION),//版本号
                                 CFSwapInt32HostToBig((uint32_t)command),//用来判断消息类型,如验证身份,新消息,加入房间,退出房间,或者是心跳数据
                                 CFSwapInt32HostToBig((uint32_t)seq)//聊天室的id
                                 };
               然后通过socket 把数据写入传给服务器 tag 为自己定义的表示 用来区分类型
               [self.socket writeData:requestData withTimeout:WRITE_TIME_OUT tag:LCS_DEFAULT_TAG];
               回调UI控制器,提示连接成功
    2.1 如果连接失败 根据具体情况 如果是超时,意外断开,那么开始重新连接 达到重连次数,那么不再连接
 
 3. 接下来 就是通过 socket didReadData  didWriteData 两个代理方法接受和发送数据
 3.1 接收数据:
      - (void)socket:(LCSAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
     拿到数据以后首先进行解包
      取出数据的包首,b拿到包的长度 然后和接收到的data 长度进行比较, 如果想等就是完整包,
      完整包对消息类型判断:
                 1.身份验证成功则是 开始心跳,然后更新用户数据添加房间号,进行加入房间请求 socket发送
                 2.如果其他的几种情况如: 新消息,加入房间,等则直接处理包数剧
 完整包解析:
    取出包首,拿到聊天室id 判断是否为当前聊天室,如果不是 return
    如果是当前聊天室 把数据解析json 通过代理方法把数据传给应用界面
 
 如果是有分包数据 当前为第一次接收:
       创建 数据接收对象 将包长和数据类型 以及当前数据复制给他,
 如果收到的是分包的第二包以及以后的数据
      如果新数据添加以后 数据完整,那么进行数据解包,如果数据超过了(异常)
 //如果数据异常:粘包现象
       截取多余的数据,如果该数据长度 小于 包首的长度,那么直接舍弃
       如果大于包首长度,则按照有分包的数据处理
 
 
 */


 AFNetworing 线程分析

https://www.jianshu.com/p/b5c27669e2c1

 通过NSOperation 实现控制 监听网络请求的 创建、进行、取消、完成、暂停恢复、异常等问题及状态
 */

论坛
http://www.52im.net/forum.php?mod=viewthread&tid=1090

相关文章

网友评论

      本文标题:SOCKET 和 AFNet

      本文链接:https://www.haomeiwen.com/subject/rvbxdqtx.html