1. 程式人生 > >ios socket 實現簡單的聊天系統

ios socket 實現簡單的聊天系統

#import "GYServiceListener.h" #import "GCDAsyncSocket.h" @interface GYServiceListener () <GCDAsyncSocketDelegate> @property (nonatomic, strong) GCDAsyncSocket *serverSocket; // 儲存連線的所有客戶端的socket物件 @property (nonatomic, strong) NSMutableArray *clientSockets; @end @implementation GYServiceListener
- (NSMutableArray *)clientSockets { if (!_clientSockets) { _clientSockets = [NSMutableArray array]; } return _clientSockets; } // 開啟10086服務 - (void)start { //1.建立一個socket物件 給他一個埠號5288 //serverSocket 伺服器端的socket只監聽 有沒有客戶端的請求連線 //在socket的代理方法中,可以監聽到客戶端的請求 GCDAsyncSocket *serverSocket = [[GCDAsyncSocket alloc] initWithDelegate:self
delegateQueue:dispatch_get_global_queue(0, 0)]; //2.繫結埠, 並開啟監聽, 下面這段程式碼也封裝了開啟監聽, 代表10086服務已經開啟 NSError *error = nil; [serverSocket acceptOnPort:5288 error:&error]; if (!error) { NSLog(@"10086服務開啟成功"); } else{ // 失敗的原因有可能是埠被其他程式佔用了 NSLog(@"10086服務開啟失敗 %@", error); } self
.serverSocket = serverSocket; } /** * 有客戶端的socket連線到伺服器 * sock 服務端的socket * newSocket 客戶端連線過來的socket */ - (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket { NSLog(@"serverSocket -- %@", sock); NSLog(@"clientSocket -- %@", newSocket); // 1.儲存客戶端的socket [self.clientSockets addObject:newSocket]; // 2.監聽客戶端有沒有資料上傳 // 傳遞過來的客戶端的socket來監聽有沒有資料上床 // -1 代表不超時, tag標示作用,暫時用不到,寫0 // 如果有資料, 就會呼叫-socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag代理方法 [newSocket readDataWithTimeout:-1 tag:0]; } /** * 讀取客戶端請求的資料 * sock 客戶端的socket */ - (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag { // 1.讀取資料 NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"接受到客戶端上傳的資料 : %@", string); // 2.處理請求,寫資料, 返回資料給客戶端 (這裡只是模擬,我只是讓客戶端給客戶端傳送來的資料,然後再給它傳給客戶端) [sock writeData:data withTimeout:-1 tag:0]; #warning 每次讀取完資料後, 都要呼叫一次監聽資料的方法, 否則只會接受一次資料 [sock readDataWithTimeout:-1 tag:0]; } @end