**
IOS开发之利用AsyncSocket实现即时通信(一)
这是我的个人博客,欢迎大家常来围观。
AsyncSocket简介
在实现App的时候经常需要进行实时的网络通信,也就是即时通信。
实现即时通信的方式很多,可以利用极光、融云等即时通信平台进行通信,也可以利用一些打包类进行简单的即时通信。这些打包类也有很多,例如GCDAsyncSocket,AsyncSocket等等,但他们的使用方法都是共通的。这里以AsyncSocket为例,讲解一下其使用过程。
AsyncSocket是一套开源的网络访问类库。 iphone的标准推荐CFNetwork C库编程.但是编程比较麻烦。在其它OS往往用类来封装的对Socket函数的处理。比如MFC的CAsysncSocket,Java里面的Socket和SocketServer.在iphone也有类似于开源项目,就是AsyncSocket库, 官方网站:http://code.google.com/p/cocoaasyncsocket/ 它用来简化CFnetwork的调用.
AsyncSocket的基本使用
在项目引入ASyncSocket库
1.下载ASyncSocket库源码
2.把ASyncSocket库源码加入项目:
只需要增加RunLoop目录中的AsyncSocket.h、AsyncSocket.m、AsyncUdpSocket.h和AsyncUdpSocket.m四个文件。
3.在项目增加CFNetwork框架
在Framework目录右健,选择Add—>Existing Files…, 选择 CFNetwork.framework
连接服务器
首先引入头文件,声明一个AsyncSocket对象,再调用connection与服务器建立连接,代码如下:
import “AsyncSocket.h”
然后就是与服务器建立链接了
// socket连接
-(void)socketConnectHost{
self.socket = [[AsyncSocket alloc] initWithDelegate:self];
NSError *error = nil;
[self.socket connectToHost:self.socketHost onPort:self.socketPort withTimeout:3 error:&error];
}
与Java中的客户端部分代码相似,AsyncSocket代码也需要指定服务端地址和服务端口. ####发送数据 发送数据的代码很简单
NSString longConnect = @”longConnect”;
NSData dataStream = [longConnect dataUsingEncoding:NSUTF8StringEncoding];
[self.socket writeData:dataStream withTimeout:1 tag:1];
AsyncSocket向服务器发送数据都是先将数据转换生成二进制的data数据,再向服务端进行发送的。 ####接收数据 为了收到socket的消息,我们需要在长连接方法中进行读取数据
[self.socket readDataWithTimeout:30 tag:0];
如果得到数据,会调用回调方法
-(void)onSocket:(AsyncSocket )sock didReadData:(NSData )data withTag:(long)tag
{
// 对得到的data值进行解析与转换即可
}
AsyncSocket的中级使用
在进行通信的时候经常会遇到一些不可抗力的因素,例如:服务端崩溃,手机端App闪退,手机断网了等等各种导致连接断开,而一个优秀的App是不应该允许这些情况影响用户体验的。
这个时候可以采取的一种方式是:创建一个类,继承AsyncSocket,重写他的下列方法。
// Disconnect Implementation
(void)closeWithError:(NSError *)err;
(void)recoverUnreadData;
(void)emptyQueues;
(void)close;
在对应的方法中进行相应的容错处理就可以了。