使用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