#import "Serverlistener.h"
#import "GCDAsyncSocket.h"
@interface Serverlistener ()<GCDAsyncSocketDelegate>
@property (nonatomic, strong) GCDAsyncSocket *server;
// 用于存儲所有客戶端的Socket對象 --
@property (nonatomic, strong) NSMutableArray *clientSockets;
@end
@implementation Serverlistener
- (NSMutableArray *)clientSockets{
if (!_clientSockets) {
_clientSockets = [NSMutableArray array];
}
return _clientSockets;
}
- (void)viewDidLoad {
[super viewDidLoad];
}
/**
1.服務(wù)器綁定端口
2.監(jiān)聽客戶端的連接
3.允許客戶端建立連接
4.讀取客戶端的請求數(shù)據(jù)
5.處理客戶端的請求數(shù)據(jù)
6.響應(yīng)客戶端的請求數(shù)據(jù)
*/
// 1. 創(chuàng)建服務(wù)端的socket 并綁定服務(wù)器端口號
- (void)start{
// 1.創(chuàng)建服務(wù)器綁定端口
//1.1 創(chuàng)建一個Socket對像__代理__代理隊列 (說明該代理在那個線程中調(diào)用)
self.server = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_global_queue(0, 0)];
// 1.2綁定端口_監(jiān)聽客戶端面的連接__5288端口號 端口號需大于1024 (因為1024的為系統(tǒng)所用)
NSError *error = nil;
[self.server acceptOnPort:5288 error:&error];
if (error) {
NSLog(@"服務(wù)器開啟失敗");
}else{
NSLog(@"服務(wù)器開啟成功");
}
// 調(diào)用開啟 __ 在main中調(diào)用就可以了 并開啟
[[NSRunLoop mainRunLoop] run]; -- 在main中開啟
}
// 2. 監(jiān)聽客戶端的連接_有新的客戶端連接就會調(diào)用該方法 newSocket 表示一個新的客戶端
- (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket{
NSLog(@"有客戶端請求連接");
// 3.允許客戶端連接
// 3.1_我們要將新的客戶端進(jìn)行存儲起來 否則連接到之后 出了該模塊 就會斷開
[self.clientSockets addObject:newSocket];
// 3.2 一旦連接成功 給予客戶端數(shù)據(jù)相應(yīng)__ 客戶端連接成功之后就會看到這些
NSMutableString *dataStr = [NSMutableString string];
[dataStr appendString:@"歡迎來到10086在線服務(wù),請輸入下面的文字選擇服務(wù)\n"];
[dataStr appendString:@"[0]在線充值\n"];
[dataStr appendString:@"[1]在線投訴\n"];
[dataStr appendString:@"[2]優(yōu)惠信息\n"];
[dataStr appendString:@"[3]特殊服務(wù)\n"];
[dataStr appendString:@"[4]退出\n"];
[newSocket writeData:[dataStr dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0];
// 3.3調(diào)用客戶端讀取數(shù)據(jù)的方法 選擇讀取數(shù)據(jù)的代理方法才會調(diào)用 __ 客戶端選擇相應(yīng)的東東之后 為了服務(wù)端能夠監(jiān)測到 所以
// -1 :不超時 0 : 隨便寫 目前用不到
[newSocket readDataWithTimeout:-1 tag:0];
}
// 4.讀取客戶端請求數(shù)據(jù) __ 監(jiān)測客戶端的 選擇
#warning 使用這個代理方法之前 需要調(diào)用 [newSocket readDataWithTimeout:-1 tag:0]; 否則該方法不會調(diào)用
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{
NSString *readStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",readStr);
#warning 下次還想繼續(xù)監(jiān)聽 仍需再調(diào)用 [newSocket readDataWithTimeout:-1 tag:0];該方法
[sock readDataWithTimeout:-1 tag:0];
NSString *reulitStr = nil;
switch ([readStr integerValue]) {
case 0:
reulitStr = @"在線充值暫時不支持\n";
break;
case 1:
reulitStr = @"不要亂投訴\n";
break;
case 2:
reulitStr = @"沖一萬送5千\n";
break;
case 3:
reulitStr = @"沒有特殊服務(wù)\n";
break;
case 4:
reulitStr = @"退出\n";
break;
default:
break;
}
// 響應(yīng)客戶端的請求數(shù)據(jù) __ 將客戶端 選擇的東西展示給客戶端看
[sock writeData:[reulitStr dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0];
// 斷開連接
if ([readStr integerValue] == 4) {
[self.clientSockets removeObject:sock];
}
}
終端使用 :
$ telnet +IP地址
即可調(diào)用(測試)