iOS学习首页投稿(暂停使用,暂停投稿)iOS Developer

Socket示例

2016-10-09  本文已影响84人  uproject

1.1-GCDScoket

下载地址:https://github.com/robbiehanson/CocoaAsyncSocket

1.2-关于终端命令

1.3-使用GCDSocket搭建mac端scoket服务器

#import "ViewController.h"
#import "GCDAsyncSocket.h"

@interface ViewController ()<GCDAsyncSocketDelegate>
@property (weak) IBOutlet NSTextField *postNumTextField;
//服务端GCDAsyncSocket
//
@property(nonatomic,strong)GCDAsyncSocket *serviceSocket;
//客户端的Socket
//
@property(nonatomic,strong)GCDAsyncSocket *clientSocket;
//保存多个客户端Socket
//
@property(nonatomic,strong)NSMutableArray<GCDAsyncSocket *> *clientArr;

@end

@implementation ViewController
- (void)viewDidLoad { 
    [super viewDidLoad];
 // Do any additional setup after loading the view.
}
- (NSMutableArray<GCDAsyncSocket*>*)clientArr{
   if (_clientArr != nil) { 
        return _clientArr;
    } 
   _clientArr = [NSMutableArray array];

   return _clientArr;
}

//懒加载服务端
-(GCDAsyncSocket*)serviceSocket{
   if (_serviceSocket != nil) {
       return _serviceSocket; 
    }
   _serviceSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
   return _serviceSocket;
}
- (void)setRepresentedObject:(id)representedObject { 
   [super setRepresentedObject:representedObject]; 
// Update the view, if already loaded.
}
- (IBAction)startButtonClick:(id)sender {
    NSError *error = nil; 
//开始监听端口号
    [self.serviceSocket acceptOnPort:self.postNumTextField.intValue error:&error]; 

    if (error == nil) {
       NSLog(@"监听成功");
     } else {
        NSLog(@"监听失败"); 
      }
}
#pragma mark - NSASCIIStringEncoding
//监听到新加入的客户端
- (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket{
//    //需要强引用持有新的客户端socket 某则将会被释放导致无法连接
//    self.clientSocket = newSocket; 
//    将新的客户端添加到数组 
    [self.clientArr addObject:newSocket]; 
//读取该客户端数据 Timeout:等待时间 -1表示永久等待 tag是一个标记 没什么大作用
 [newSocket readDataWithTimeout:-1 tag:0]; 
//给客户端发送数据 

    NSString *string = @"你知道我在等你吗?"; 
    [newSocket writeData:[string dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0];
}
//接收数据
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{ 
    NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
    NSLog(@"%@",string); 
    //继续读取数据 
    [sock readDataWithTimeout:-1 tag:0];
     //将接收的数据发送给其他的客户端 
    for (GCDAsyncSocket *otherSocket in self.clientArr) { 
        //过滤消息发送者本身
         if (otherSocket != sock) {

               [otherSocket writeData:[string dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0]; 
              } 
        }
}

@end

1.4-使用terminal终端模拟客户端

//Socket连接服务器
[sock connectToHost:@"127.0.0.1" onPort:1234 error:nil];

1.5 效果展示

上一篇下一篇

猜你喜欢

热点阅读