美文网首页
10086服务端监听

10086服务端监听

作者: 陈水寒 | 来源:发表于2017-04-06 10:53 被阅读16次

    使用CocoaAsyncSocket第三方库,创建一个服务端socket并绑定一个端口,开启监听,通过代理方法获取连接上来的客户端及数据收发

    采用命令行创建一个工程

    • 创建服务端socket代码如下
        // 1. 创建监听
        GCDAsyncSocket *serverSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_global_queue(0, 0)];
        
        // 2. 绑定端口号
        NSError *error = nil;
        [serverSocket acceptOnPort:30000 error:&error]; //  该方法同时会开启监听
        if (!error) {
            NSLog(@"端口创建成功,开始监听");
        }else {
            NSLog(@"端口创建失败");
        }
        
        self.serverSocket = serverSocket;
    
    • 代理方法
    /**
     *  每当有一个新的客户端连接时调用该方法
     *
     *  @param sock      服务端socket
     *  @param newSocket 客户端socket
     */
    - (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket
    {
        NSLog(@"sockServer:%@ newSocket:%@",sock,newSocket);
        // 将连接上来的客户端加入到数组中
        [self.clientSockets addObject:newSocket];
        
        NSMutableString *serviceStr = [NSMutableString string];
        [serviceStr appendString:@"欢迎使用10086服务,请输入对应的服务码\n"];
        [serviceStr appendString:@"[1]人工服务\n"];
        [serviceStr appendString:@"[2]在线投诉\n"];
        [serviceStr appendString:@"[3]优惠充值\n"];
        [serviceStr appendString:@"[4]退出\n"];
        
        // 向客户端发送数据
        [newSocket writeData:[serviceStr dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0];
        
        // 监听客户端数据接收
        // Timeout:数据接收超时时间,-1表示永远接收不超时
        // tag:标识作用,现在不用,就写0
        [newSocket readDataWithTimeout:-1 tag:0];
    }
    
    /**
     *  每次客户端发送数据时调用该方法
     *
     *  @param sock 客户端socket
     *  @param data 发送的数据
     *  @param tag
     */
    - (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
    {
        NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        NSLog(@"客户端发送的数据:%@",str);
        
        NSInteger code = [str integerValue];;
        NSString *responseStr = nil;
        
        switch (code) {
            case 1:
                responseStr = @"人工服务暂停中。。。\n";
                break;
            case 2:
                responseStr = @"在线投诉暂停中。。。\n";
                break;
            case 3:
                responseStr = @"优惠充值暂停中。。。\n";
                break;
            case 4:
                responseStr = @"您已经成功退出\n";
                break;
                
            default:
                responseStr = @"非法操作符\n";
                break;
        }
        
        // 返回数据
        [sock writeData:[responseStr dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0];
        
        if (code == 4) {
            [self.clientSockets removeObject:sock];
        }
        
        // 每次数据接收完成后,需要重新开启监听
        [sock readDataWithTimeout:-1 tag:0];
    }
    

    演示效果如下:

    服务端监听演示效果.gif

    相关文章

      网友评论

          本文标题:10086服务端监听

          本文链接:https://www.haomeiwen.com/subject/htwfattx.html