使用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];
}
演示效果如下: