socket server端应用

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];
    
    
}

你可能感兴趣的:(socket server端应用)