10086服務端監聽

使用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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 轉載:http://www.cocoachina.com/ios/20170615/19529.html 參考:h...
    F麥子閱讀 4,041評論 3 2
  • 相關概念: 單播、多播(組播)和廣播的區別 http://blog.csdn.net/wangerge/artic...
    三毛中隊長閱讀 4,197評論 0 1
  • 前幾天,公司有一個長連接的需求。需要在移動端搭建一個服務器,一邊后臺可以給推送消息。通過從網上查找資料,終于現在弄...
    大江哥哥閱讀 615評論 3 4
  • 先UDP組播 socket 再TCP建立長連接 同一個局域網下,各設備提供udp socket監聽服務,手機客戶端...
    蛋白質corn閱讀 329評論 0 0
  • 我其實不是一個善于言辭的人,更多時候我比較愿意保持沉默,我始終覺得沉默讓我在她們眼里變的善良。 很多人眼里大概我都...
    安憶年閱讀 126評論 0 0