iOS开发之利用AsyncSocket实现即时通信(一)

贝自怡
2023-12-01

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;

在对应的方法中进行相应的容错处理就可以了。

 类似资料: