Socket-群聊

2017-06-24  本文已影响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

上一篇下一篇

猜你喜欢

热点阅读