浅谈CocoaAsyncSocket

因为项目中需要使用Socket进行数据传输,所以简单介绍一样使用CocoaAsyncSocket的心得。

一.CocoaAsyncSocket介绍

CocoaAsyncSocket中主要包含两个类:

1.GCDAsyncSocket.//基于TCP/IP协议的socket网络库

2.GCDAsyncUdpSocket.//基于UDP/IP协议的socket网络库

二.Client端使用

1.需要导入GCDAsyncUdpSocketDelegate或者GCDAsyncSocketDelegate协议

2.声明属性

@property (strong, nonatomic) GCDAsyncSocket *clientSocket;
复制代码

3.创建对象

self.clientSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
复制代码

4.连接指定主机的对应端口

//address和port自定义
NSError *error = nil;
self.connected = [self.clientSocket connectToHost:self.address onPort:self.port viaInterface:nil withTimeout:-1 error:&error];
复制代码

5.连接成功

- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port 
{
//    NSLog(@"连接主机端口%@", sock);
 
    // 连接后,可读取服务端的数据 第一次读取数据 timeout为-1代表一直等
    [self.clientSocket readDataWithTimeout:-1 tag:0];
}
复制代码

6.发送数据

- (void)sendMessage:(id)msg
{
    //最终数据都需要转成NSData对象进行传输,这里只是举例
    NSData *data = [msg dataUsingEncoding:NSUTF8StringEncoding];
    // Timeout -1 : 无穷大,一直等
    // tag : 消息标记
    [self.clientSocket writeData:data withTimeout:-1 tag:0];
}
复制代码

7.读取数据

- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag 
{
    // 读取到服务端数据值后,能一直读取
    [self.clientSocket readDataWithTimeout:- 1 tag:0];
}
复制代码

8.断开连接

- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err
{
    //断开的时候把代理和本身都置nil
    self.clientSocket.delegate = nil;
    self.clientSocket = nil;
}
复制代码

最后讲一下粘包的处理思路,socket传输的都是数据流,不一定是你想要的一整条数据,这时候就需要对数据做处理。创建一个缓冲区,存放收到的所有数据,够一条拿走,从缓冲区删掉,不够一条数据就暂存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值