iOS 网络通信03

实现这个功能,需要分三步:开启服务 、实现服务功能 、关闭服务

可以通过在终端  telnet IP地址   端口号   将自己的电脑设置为服务器。

一、开启服务

/**
 *  开启10086服务 端口:5288
 */
-(void)start{
   //创建一个Socket对象作用:监听是否有客户端请求链接
    GCDAsyncSocket *serverSocket = [[GCDAsyncSocket alloc]initWithDelegate:self delegateQueue:dispatch_get_global_queue(0, 0)];
    //绑定端口 并开启监听  代表10086服务已经开启
    NSError *error = nil;
    [serverSocket acceptOnPort:5288 error:&error];
    if (!error) {
        NSLog(@"服务开启成功");
    }else{
        NSLog(@"服务器开启失败:%@",error);
    }
    self.serverSocket = serverSocket;
}

说明:需要引入头文件#import "GCDAsyncSocket.h";指定端口号。

二、实现服务功能

#pragma mark -- 有客户端Socket连接到服务器
-(void)socket:(GCDAsyncSocket *)serverSocket didAcceptNewSocket:(GCDAsyncSocket *)clientSocket{

    NSLog(@"serve:%@",serverSocket);
    NSLog(@"client:%@",clientSocket);
    //1.保存客户端的Socket
    [self.clientSockets addObject:clientSocket];
    
    //提供服务
    NSMutableString *serverStr = [NSMutableString string];
    [serverStr appendString:@"欢迎来到10086网上客服\n"];
    [serverStr appendString:@"[0]充值\n"];
    [serverStr appendString:@"[1]查询\n"];
    [serverStr appendString:@"[2]投诉\n"];
    [serverStr appendString:@"[3]评价\n"];
    [serverStr appendString:@"[4]退出\n"];

    [clientSocket writeData:[serverStr dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0];
    //2.监听客户端是否有数据上传
    [clientSocket readDataWithTimeout:-1 tag:0];
}
#pragma mark -- 通过服务器读取客户请求的数据
-(void)socket:(GCDAsyncSocket *)clientSocket didReadData:(NSData *)data withTag:(long)tag{
    //1 把NSData转NSString
    NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
    //2 字符串转数字
    NSInteger code = [str integerValue];
    NSString *responseStr = nil;
    switch (code) {
        case 0:
            responseStr = @"这个是充值平台\n";
            break;
        case 1:
            responseStr = @"这个是查询平台\n";
            break;
        case 2:
            responseStr = @"这个是投诉平台\n";
            break;
        case 3:
            responseStr = @"这个是评价平台\n";
            break;
        case 4:
            responseStr = @"退出成功";
            break;
        default:
            break;
    }
    
    [clientSocket writeData:[responseStr dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0];

    if (code == 4) {
        //移除客户端
        [self.clientSockets removeObject:clientSocket];
    }
#warning 每次读完数据后,都要用一次监听数据的方法
    [clientSocket readDataWithTimeout:-1 tag:0];   
}

说明:这两个方法都是GCDAsyncSocket的代理方法:1.链接服务器,2.通过客户的输入请求服务端的数据。

注意:每一次数据的改变都要调用一次监听方法

[clientSocket readDataWithTimeout:-1 tag:0];

三、移除客户端

[self.clientSockets removeObject:clientSocket];

你可能感兴趣的:(GCDAsyncSocket)