IOS-基于CocoaAsyncSocket的服務(wù)端的監(jiān)聽(二)

Socket通信流程

首先,我們對(duì)著這張流程圖先搭建一個(gè)本地的TCP服務(wù)器端
要經(jīng)過(guò)的流程就是socket-->bind()-->listen-->accept,當(dāng)然我們也會(huì)建立客戶端玉服務(wù)端的連接。
我們要先PodCocoaAsyncSocket,這是基于C語(yǔ)言包裝的OC庫(kù),非常好用。

  • 準(zhǔn)備工作:
  • 1、
    我們先搭建本地的服務(wù)器包管理器
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"  
  • 2、安裝
brew install
  • 3、然后才能使用命令
telnet 主機(jī)IP 終端號(hào)
  • 開始
    Xcode創(chuàng)建終端,創(chuàng)建一個(gè)NSObject類

VVenServiListener.h里

/**
 開啟服務(wù)
 */
-(void)stard;

VVenServiListener.m里
因?yàn)槲覀兪墙CP安全連接,所以

#import "GCDAsyncSocket.h"
@interface VVenServiListener()<GCDAsyncSocketDelegate>
{
    GCDAsyncSocket *serverSocket;
}
/**
 用戶保存客戶端的所有對(duì)象,因?yàn)? */
@property (nonatomic, strong) NSMutableArray *clientSockets;
- (NSMutableArray *)clientSockets{
    if (!_clientSockets) {
        _clientSockets = [NSMutableArray array];
    }
    return _clientSockets;
}
//在這里已經(jīng)服務(wù)端已經(jīng)完成了socket-->bind()-->listen()-->accept()
- (void)stard{
    //開啟10086的服務(wù):5288
    //1、創(chuàng)建一個(gè)socket對(duì)象
    // serverSocket 服務(wù)端的socket只監(jiān)聽有沒有客戶端請(qǐng)求連接。不做對(duì)數(shù)據(jù)的監(jiān)聽。所以對(duì)客戶端數(shù)據(jù)的監(jiān)聽是存在服務(wù)端的客戶端數(shù)據(jù)自己監(jiān)聽的
    serverSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_global_queue(0, 0)];
    //2、綁定端口,并監(jiān)聽。代表10086服務(wù)已經(jīng)開啟
    NSError *error = nil;
    [serverSocket acceptOnPort:5288 error:&error];
    if (!error) {
        NSLog(@"10086服務(wù)開啟成功");
    }else{
        NSLog(@"10086服務(wù)開啟失敗  %@",error);
    }
}
//打開終端輸入telnet 本機(jī)IP和端口號(hào)5288,就能接受到客戶端給服務(wù)端的請(qǐng)求
#pragma mark 有客戶端的socket連接到服務(wù)器
- (void)socket:(GCDAsyncSocket *)serverSocket didAcceptNewSocket:(GCDAsyncSocket *)clientSocket{
    NSLog(@"serverSocket:%@   clientSocket:%@",serverSocket,clientSocket);
    //1、保存客戶端的socket
    //clientSocket 如果被釋放了那么連接就會(huì)被關(guān)閉。顯示Connection closed by foreign host.
    //所以客戶端要用一個(gè)數(shù)組保存住客戶端的數(shù)據(jù)
    [self.clientSockets addObject:clientSocket];
    //2、提供服務(wù)
    NSMutableString *servieceStr = [NSMutableString string];
    [servieceStr appendString:@"歡迎來(lái)到10086在線服務(wù),請(qǐng)輸入下面的數(shù)字選擇服務(wù)\n"];
    [servieceStr appendString:@"[0]在線充值\n"];
    [servieceStr appendString:@"[1]在線投訴\n"];
    [servieceStr appendString:@"[2]優(yōu)惠信息\n"];
    [servieceStr appendString:@"[3]特殊服務(wù)\n"];
    [servieceStr appendString:@"[4]退出\n"];
    
    [clientSocket writeData:[servieceStr dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0];

    //3、
    /**
     保存在服務(wù)端的客戶端數(shù)據(jù)監(jiān)聽客戶端的數(shù)據(jù)有沒有上傳
     -1 代表不超時(shí)
     */
    [clientSocket readDataWithTimeout:-1 tag:0];
}

#pragma mark 服務(wù)端讀取客戶端請(qǐng)求數(shù)據(jù)
- (void)socket:(GCDAsyncSocket *)clientSocket didReadData:(NSData *)data withTag:(long)tag{
    NSLog(@"clientSocket讀取保存在severSocket的clientSocket數(shù)據(jù):%@",clientSocket);
   //1、NSData轉(zhuǎn)成string
    NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    //2、字符串轉(zhuǎn)數(shù)字
    NSInteger code = [str integerValue];
    NSString *responseStr = nil;
    switch (code) {
        case 0:
            responseStr = @"充值暫停\n";
            break;
        case 1:
            responseStr = @"投訴暫停\n";
            break;
        case 2:
            responseStr = @"優(yōu)惠暫停\n";
            break;
        case 3:
            responseStr = @"服務(wù)暫停\n";
            break;
        case 4:
            responseStr = @"退出成功";
            break;
        default:
            break;
    }
    NSLog(@"接受到客戶端上傳的數(shù)據(jù)responseStr:%@",responseStr);
    //3、處理請(qǐng)求,返回?cái)?shù)據(jù)給客戶端
    [clientSocket writeData:[responseStr dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0];
    if (code==4) {
        [self.clientSockets removeObject:clientSocket];
    }
#warning 只會(huì)讀取1次 每次讀完數(shù)據(jù)都要監(jiān)聽
    [clientSocket readDataWithTimeout:-1 tag:0];
}

在main函數(shù)中

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"Hello, World!");
        //1,創(chuàng)建一個(gè)服務(wù)監(jiān)聽對(duì)象
        VVenServiListener *listener = [[VVenServiListener alloc] init];
        //2,開啟監(jiān)聽
        [listener stard];
        //3,開啟主運(yùn)行循環(huán),讓服務(wù)不能停
        [[NSRunLoop mainRunLoop] run];
    }
    return 0;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容