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