实现这个功能,需要分三步:开启服务 、实现服务功能 、关闭服务
可以通过在终端 telnet IP地址 端口号 将自己的电脑设置为服务器。
一、开启服务
/**
* 开启10086服务 端口:5288
*/
-(void)start{
//创建一个Socket对象作用:监听是否有客户端请求链接
GCDAsyncSocket *serverSocket = [[GCDAsyncSocket alloc]initWithDelegate:self delegateQueue:dispatch_get_global_queue(0, 0)];
//绑定端口 并开启监听 代表10086服务已经开启
NSError *error = nil;
[serverSocket acceptOnPort:5288 error:&error];
if (!error) {
NSLog(@"服务开启成功");
}else{
NSLog(@"服务器开启失败:%@",error);
}
self.serverSocket = serverSocket;
}
说明:需要引入头文件#import "GCDAsyncSocket.h";指定端口号。
二、实现服务功能
#pragma mark -- 有客户端Socket连接到服务器
-(void)socket:(GCDAsyncSocket *)serverSocket didAcceptNewSocket:(GCDAsyncSocket *)clientSocket{
NSLog(@"serve:%@",serverSocket);
NSLog(@"client:%@",clientSocket);
//1.保存客户端的Socket
[self.clientSockets addObject:clientSocket];
//提供服务
NSMutableString *serverStr = [NSMutableString string];
[serverStr appendString:@"欢迎来到10086网上客服\n"];
[serverStr appendString:@"[0]充值\n"];
[serverStr appendString:@"[1]查询\n"];
[serverStr appendString:@"[2]投诉\n"];
[serverStr appendString:@"[3]评价\n"];
[serverStr appendString:@"[4]退出\n"];
[clientSocket writeData:[serverStr dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0];
//2.监听客户端是否有数据上传
[clientSocket readDataWithTimeout:-1 tag:0];
}
#pragma mark -- 通过服务器读取客户请求的数据
-(void)socket:(GCDAsyncSocket *)clientSocket didReadData:(NSData *)data withTag:(long)tag{
//1 把NSData转NSString
NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
//2 字符串转数字
NSInteger code = [str integerValue];
NSString *responseStr = nil;
switch (code) {
case 0:
responseStr = @"这个是充值平台\n";
break;
case 1:
responseStr = @"这个是查询平台\n";
break;
case 2:
responseStr = @"这个是投诉平台\n";
break;
case 3:
responseStr = @"这个是评价平台\n";
break;
case 4:
responseStr = @"退出成功";
break;
default:
break;
}
[clientSocket writeData:[responseStr dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0];
if (code == 4) {
//移除客户端
[self.clientSockets removeObject:clientSocket];
}
#warning 每次读完数据后,都要用一次监听数据的方法
[clientSocket readDataWithTimeout:-1 tag:0];
}
说明:这两个方法都是GCDAsyncSocket的代理方法:1.链接服务器,2.通过客户的输入请求服务端的数据。
注意:每一次数据的改变都要调用一次监听方法
[clientSocket readDataWithTimeout:-1 tag:0];
三、移除客户端
[self.clientSockets removeObject:clientSocket];