Socket示例

作者: uproject | 来源:发表于2016-10-09 22:37 被阅读84次

    1.1-GCDScoket

    • 该框架提供了一套底层API来处理这些过程

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

    1.2-关于终端命令

    • 查看ip和mac地址: arp -a

    • 使用终端链接命令: 格式:telnet空格【ip地址】空格【端口号】 例如: telnet 127.0.0.1 1234

    • 本机ip地址:127.0.0.1

    • 端口号

    • 总范围:0~65535

    • 周知端口:0~1023 通常由Unix系统占用

    • 注册端口:1025~49151 一般由系统自动分配

    • 1024端口一般不固定分配给某个服务,在英文中的解释是“Reserved”(保留)。之前,我们曾经提到过动态端口的范围是从1024~65535,而1024正是动态端口的开始。该端口一般分配给第一个向系统发出申请的服务,在关闭服务的时候,就会释放1024端口,等待其他服务的调用

    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终端模拟客户端

    • 调用命令 telnet 127.0.0.1 1234 相当于调用GCDSocket代码
    //Socket连接服务器
    [sock connectToHost:@"127.0.0.1" onPort:1234 error:nil];
    

    1.5 效果展示

    相关文章

      网友评论

        本文标题:Socket示例

        本文链接:https://www.haomeiwen.com/subject/ejjmyttx.html