iOS之AsyncSocket使用心得
2015-11-07 22:08
746 查看
首先 下载源代码
倒入runloop文件夹下的 四个文件即可
AsyncSocket *socket=[[AsyncSocketalloc]initWithDelegate:self];
NSError *error;
[socket connectToHost:h onPort:p withTimeout:-1error:&error
];
然后实现一些Delegate方法
A:- (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port;
B:- (void)onSocketDidSecure:(AsyncSocket *)sock;
C:- (void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err;
D:- (void)onSocketDidDisconnect:(AsyncSocket *)sock;
E:- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag;
监听网络操作
如果链接成功会调用A
如果我们想读取数据 就在A方法中 加入[socket readDataWithTimeout:-1 tag:0]; 当收到数据的时候 会调用E 当调用E之后 我们的这个读取请求就完成了,不再监听网络,若想一直监听网络 在E中 也加入[socket readDataWithTimeout:-1 tag:0];
这个库若想监听网络,必须先设置[socket readDataWithTimeout:-1 tag:0];这里面的tag很重要。如果你写的时候用的tag与读的不相同,那么永远在回调的地方没有回复。
当读的时候,需要判断长度是否足够,如果不够需要再次设置[socket readDataWithTimeout:-1 tag:0];
如果你需要保持这条链路,就不要用它的超时,因为默认超时,会断开连接。你再超时回调处,再次设置时间,也只是延长等待时间,到点仍是断链。
cilent向主机发送命令,每次发送一条后 主动断开
connectToHost:这个方法会返回一个bool 但是每次都返回yes 原因是这个方法yes 与no 表示 是否尝试着去链接host 并不代表是否链接成功
所以要想知道是否链接成功 要看是否调用了A方法
如果我们写如下的代码
-(void)xxxxxxxxpressed:(xxx)xxxx{
[socket connectToHost:h onPort:p withTimeout:-1error:&error
];
[socket writeData:currentConmandwithTimeout:-1tag:button.tag];
[socket disconnectAfterWriting];
}
每次事件发生的时候 进行链接 并且马上发送数据,然后 等Writing结束后 撤销链接 这样在100%能链接上的情况下是没有问题的
但是 当主机出现问题 链接不上的时候, connectToHost:之后 马上写入数据,但是这个写入请求永远不会完成,所以之后的disconnectAfterWriting
一直会等待下去不执行,则这个connect仍然处于链接失败 状态。
当下一次事件发生的时候,会再次链接,这时程序崩溃,错误信息是告诉我们 必须先disconnect之后 才能再次链接
原因是 connect失败导致写入无法完成,所以disconnectAfterWriting 也就无法完成
解决办法 在 这个方法的最开始 加入几句代码
[socketsetDelegate:nil];
[socket disconnect];
socket=nil;
然后每次都重新初始化一次socket即可
详细内容参考 官方文档https://github.com/robbiehanson/CocoaAsyncSocket/wiki/Reference_GCDAsyncSocket#wiki-isConnected
倒入runloop文件夹下的 四个文件即可
AsyncSocket *socket=[[AsyncSocketalloc]initWithDelegate:self];
NSError *error;
[socket connectToHost:h onPort:p withTimeout:-1error:&error
];
然后实现一些Delegate方法
A:- (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port;
B:- (void)onSocketDidSecure:(AsyncSocket *)sock;
C:- (void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err;
D:- (void)onSocketDidDisconnect:(AsyncSocket *)sock;
E:- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag;
监听网络操作
如果链接成功会调用A
如果我们想读取数据 就在A方法中 加入[socket readDataWithTimeout:-1 tag:0]; 当收到数据的时候 会调用E 当调用E之后 我们的这个读取请求就完成了,不再监听网络,若想一直监听网络 在E中 也加入[socket readDataWithTimeout:-1 tag:0];
这个库若想监听网络,必须先设置[socket readDataWithTimeout:-1 tag:0];这里面的tag很重要。如果你写的时候用的tag与读的不相同,那么永远在回调的地方没有回复。
当读的时候,需要判断长度是否足够,如果不够需要再次设置[socket readDataWithTimeout:-1 tag:0];
如果你需要保持这条链路,就不要用它的超时,因为默认超时,会断开连接。你再超时回调处,再次设置时间,也只是延长等待时间,到点仍是断链。
cilent向主机发送命令,每次发送一条后 主动断开
connectToHost:这个方法会返回一个bool 但是每次都返回yes 原因是这个方法yes 与no 表示 是否尝试着去链接host 并不代表是否链接成功
所以要想知道是否链接成功 要看是否调用了A方法
如果我们写如下的代码
-(void)xxxxxxxxpressed:(xxx)xxxx{
[socket connectToHost:h onPort:p withTimeout:-1error:&error
];
[socket writeData:currentConmandwithTimeout:-1tag:button.tag];
[socket disconnectAfterWriting];
}
每次事件发生的时候 进行链接 并且马上发送数据,然后 等Writing结束后 撤销链接 这样在100%能链接上的情况下是没有问题的
但是 当主机出现问题 链接不上的时候, connectToHost:之后 马上写入数据,但是这个写入请求永远不会完成,所以之后的disconnectAfterWriting
一直会等待下去不执行,则这个connect仍然处于链接失败 状态。
当下一次事件发生的时候,会再次链接,这时程序崩溃,错误信息是告诉我们 必须先disconnect之后 才能再次链接
原因是 connect失败导致写入无法完成,所以disconnectAfterWriting 也就无法完成
解决办法 在 这个方法的最开始 加入几句代码
[socketsetDelegate:nil];
[socket disconnect];
socket=nil;
然后每次都重新初始化一次socket即可
详细内容参考 官方文档https://github.com/robbiehanson/CocoaAsyncSocket/wiki/Reference_GCDAsyncSocket#wiki-isConnected
相关文章推荐
- 芒果iOS之显示隐藏资源库Library
- ios开发中MVC模式的理解
- iOS__拍照
- iOS__视频录制
- 中文字转拼音取首字母
- iOS讲解迷惑--MD5加密
- 模拟器可以直接把Mac 的桌面文件做为iOS调试时存储的位置
- iOS讲解迷惑--XMPP进阶 添加好友, 与好友聊天 (包括登录注册)
- iOS 简单实现下拉列表框
- 迈入ios的小小小步
- IOS推送功能push
- iOS 23种设计模式
- iOS系统地图和定位
- OC ---- 字典集合 iOS学习-----细碎知识点总结
- iOS keyboard属性详解
- OC ---- 字符串 数组 iOS学习-----细碎知识点总结
- 关于'MAMapKit/MAMapKit.h' file not found的解决方法(图文演示)
- iOS常用的几种设计模式
- iOS开发动态计算cell的高度
- iOS 那些好用的三方库索引