GCDAsyncSocket 是基于tcp和udp的socket通讯框架,以下是新版本的应用,在之前版本上做了一些改动,主要是初始化socket的方式,其他暂时还没发现,以后补充吧,这个是应用在服务端的,对端口进行监听,和客户端进行通讯等...
- 至于粘包 、分包 等其他问题,在其他文章里写到http://www.jianshu.com/p/7a5971684fab
首先初始化数据
-(void)initData{
//保存客户端的socket
_clientSocket = [NSMutableArray array];
//创建全局queue
golbalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
fileLength = 0;
/**
* GCDAsyncSocket 替代了之前旧版本的 AsyncSocket
* 新版本的需要指定队列,而之前旧版本的要设置runloop模式
* [self.socket setRunLoopModes:[NSArray arrayWithObject:NSRunLoopCommonModes]];
*/
serverSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:golbalQueue];
}
然后开启服务端
-(void)startChatServer{
//设置监听端口,一定要避开系统的端口,如果失败,就换其他端口绑定
NSError *err;
[serverSocket acceptOnPort:8888 error:&err];
if (!err) {
NSLog(@"服务开启成功");
}else{
NSLog(@"服务开启失败");
}
}
#pragma mark 有客户端建立连接的时候调用
-(void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket{
NSLog(@"客户端的socket %p",newSocket);
[self.clientSocket addObject:newSocket];
//读取客户端的数据
[newSocket readDataWithTimeout:0.1 tag:100];
}
#pragma mark 服务器写数据给客户端
-(void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag{
NSLog(@"---写给客户端:-%p",socket);
}
#pragma mark 读取部分数据 回调:一般 readDataToLength 和 readDataToData 会触发这个方法,更新进度时候会用
- (void)socket:(GCDAsyncSocket *)sock didReadPartialDataOfLength:(NSUInteger)partialLength tag:(long)tag
{
NSLog(@"--didReadPartialDataOfLength-%ld",partialLength);
[acceptSocket readDataToLength:partialLength withTimeout:10 tag:3];
}
/**
* 使用读操作已超时但还没完成时调用,此方法允许随意延迟超时,如果返回一个正的时间间隔,读取的超时将有一定量的扩展,如果不实现这个方法,或会像往常一样返回一个负的时间间隔,
* pragma mark elapsed参数是 原超时的总和,加上先前通过这种方法添加的任何补充, length参数是 读操作到目前为止已读取的字节数, 注意,如果返回正数的话,这个方法可能被一个单独的读取多次调用
*/
-(NSTimeInterval)socket:(GCDAsyncSocket *)sock shouldTimeoutReadWithTag:(long)tag elapsed:(NSTimeInterval)elapsed bytesDone:(NSUInteger)length
{
return 10;
}
#pragma mark 接收客户端传递过来的数据
-(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{
//接收到数据
NSString *receiverStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"------%@",receiverStr);
[sock writeData:[@"服务端收到消息" dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0];
}
网友评论