本案列是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