CocoaAsyncSocket 学习 (一)

socket 连接

即时通讯最大的特点就是实时性,基本感觉不到延时或是掉线,所以必须对socket的连接进行监视与检测,在断线时进行重新连接,如果用户退出登录,要将socket手动关闭,否则对服务器会造成一定的负荷。

一般来说,一个用户(对于ios来说也就是我们的项目中)只能有一个正在连接的socket,所以这个socket变量必须是全局的,这里可以考虑使用单例或是AppDelegate进行数据共享,本文使用单例。如果对一个已经连接的socket对象再次进行连接操作,会抛出异常(不可对已经连接的socket进行连接)程序崩溃,所以在连接socket之前要对socket对象的连接状态进行判断

一 下载完包结构

11794643-d65810648b7619f9

RunLoopGCD两个文件夹中有两套
一种基于NSRunloop,一种基于GCD,后面讲的都是用基于GCDCocoaAsyncSocket,因为RunLoop中的将被废弃

二 项目中应用CocoaAsyncSocket

  • GCD下四个文件拖入项目
  • 创建单例类

  • 然后写连接方法
    添加端口和服务器地址属性
    添加连接方法

实现

  • main.m中测试

运行后控制台打印

现在用的xcode8 beta2 打印东西多, 看关键哈~

12794643-c61f7e490e094dc5
此时已经连接成功
  • 此时当程序停止运行的话 服务器就会停掉 实际中我们服务器会一直开启,365天不停止,开启运行循环

  • 接下来模拟客户端接入到服务器
    遵守协议
    @interface YHSocket ()

实现代理方法

代码运行 控制台输出

终端中测试 用telnet命令

13794643-9dc5db46c25ad2d2

此时已经连接成功

socket 通信流程图

14794643-8e3540abb0a6f06e

看这句话 Connection closed by foreign host.
连接被外部服务器关闭了,服务器连上之后 还没来得及读和写就被释放了

15794643-a35f63de681b7292

因为 客户端 socket对象是局部的, 被释放了
所以我们要保存连接到服务器的客户端
定义数组 懒加载
@property (nonatomic, strong) NSMutableArray *clientSockets;// 客户端socket

连接到服务器上后 存储起来

此时我们在终端再次连接 发现 连接上之后就不再断开了

16794643-44f3cee5d7098b7b

  • 服务器接收客户端发送的数据

此时连接服务器 输入hello world 打印

17794643-fd91b3982def813b

 18794643-9d7ae60c7ac201a8
WARNING: 读取一次数据 需要重新监听一次客户端的输入

不然再次发送数据 无法读取到

// 服务端接收到客户端发送的数据之后 返回数据给 客户端

19

输入 数据 终端直接返回数据 控制台会打印

上边所有客户端与服务器的交互 都是由客户端 与服务器连接上的客户端交互
服务端负责连接客户端

  • 警告问题⚠️
    使用 CocoaAsyncSocket “kCFStreamNetworkServiceTypeVoIP is deprecated in iOS 9 ” warning 解决方案
    在iOS 9.0 中,kCFStreamNetworkServiceTypeVoIP 被弃用
20794643-8dc749faf990e1fe

解决方案:

相关链接:
https://github.com/robbiehanson/CocoaAsyncSocket/issues/402

参考

http://www.superqq.com/blog/2015/04/03/ioskai-fa-zhi-asyncsocketshi-yong-jiao-cheng/?utm_source=tuicool&utm_medium=referral

http://my.oschina.net/joanfen/blog/287238

1 收藏 评论

可能感兴趣的话题



直接登录
跳到底部
返回顶部