因为项目中需要使用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传输的都是数据流,不一定是你想要的一整条数据,这时候就需要对数据做处理。创建一个缓冲区,存放收到的所有数据,够一条拿走,从缓冲区删掉,不够一条数据就暂存。