美文网首页
Socket-群聊

Socket-群聊

作者: 严兵胜 | 来源:发表于2017-06-24 20:25 被阅读0次

    本案列是Mac 是一个demo 使用的是 CocoaAsyncSocket
    官方地址:
    https://github.com/robbiehanson/CocoaAsyncSocket
    关键的代码:

     // 将该条数据转发给其他客户端
        for (GCDAsyncSocket *socket in self.clientSocketsArray) {
            if (socket != sock) {
                [socket writeData:data withTimeout:-1 tag:0]; // 将某个客户端发来的数据 读取到之后 转发给其他客户端
            }
        }
    
    #import "GroupChatSocket.h"
    
    #import "GCDAsyncSocket.h"
    
    
    @interface GroupChatSocket ()<GCDAsyncSocketDelegate>
    
    @property (nonatomic, strong) GCDAsyncSocket *serverSocket; // 服务器Socket
    @property (nonatomic, strong) NSMutableArray *clientSocketsArray; // 存储客户端Socket 保证客户端Socket不死
    
    
    @end
    
    @implementation GroupChatSocket
    
    - (NSMutableArray *)clientSocketsArray{
        
        if (!_clientSocketsArray) {
            _clientSocketsArray = [NSMutableArray array];
        }
        return _clientSocketsArray;
    }
    
    
    - (void)star{
        
        // 1.创建服务器Socket
        self.serverSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_global_queue(0, 0)];
        
        // 1.1 给服务器 设定一个端口 -- 监听客户端的连接
        NSError *error = nil;
        [self.serverSocket acceptOnPort:5288 error:&error];
        
        if (error) {
            NSLog(@"服务器开启失败");
        }else{
            
            NSLog(@"服务器开启成功....");
        }
    }
    
    #pragma mark - Delegate
    
    #pragma mark - GCDAsyncSocketDelegate
    
    // 2.监听客户端的连接
    - (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket{
        
        
        // 3.0 允许客户端的连接
        [self.clientSocketsArray addObject:newSocket];
        
        NSLog(@"客户端连接成功_客户端数量__%lu",(unsigned long)self.clientSocketsArray.count);
        
        // 3.2调用客户端读取数据的方法 这样客户端读取数据的方法才会调用
        /**
         
         -1: 表示不超时
         
         */
        [newSocket readDataWithTimeout:-1 tag:0]; // 读客户端发来的数据
    }
    
    // 4. 读取客户端请求的数据 -- 该代理会被调用的前提是  监听到客户端有连接时  调用他的 readDataWithTimeout 方法
    - (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{
        
        NSString *dataStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        
        NSLog(@"客户端提交了__%@",dataStr);
        
        // 下次还想继续监听 仍需再调用 [newSocket readDataWithTimeout:-1 tag:0];该方法
        
        [sock readDataWithTimeout:-1 tag:0];
        
        // 将该条数据转发给其他客户端
        for (GCDAsyncSocket *socket in self.clientSocketsArray) {
            if (socket != sock) {
                [socket writeData:data withTimeout:-1 tag:0]; // 将某个客户端发来的数据 读取到之后 转发给其他客户端
            }
        }
        
        
    }
    @end
    
    

    相关文章

      网友评论

          本文标题:Socket-群聊

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