ios socket 實現簡單的聊天系統
阿新 • • 發佈:2019-02-06
#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