在前文“10086服務(wù)端監(jiān)聽”基礎(chǔ)上,修改代理方法,在接收到數(shù)據(jù)后轉(zhuǎn)發(fā)給其他client
/**
* 每次客戶端發(fā)送數(shù)據(jù)時(shí)調(diào)用該方法
*
* @param sock 客戶端socket
* @param data 發(fā)送的數(shù)據(jù)
* @param tag
*/
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
// NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
// 遍歷客戶端數(shù)組,接收到消息后轉(zhuǎn)發(fā)給其他客戶端
for (GCDAsyncSocket *currentSocket in self.clientSockets) {
if (currentSocket != sock) { // 不給自己轉(zhuǎn)發(fā)消息
[currentSocket writeData:data withTimeout:-1 tag:0];
}
}
// 每次數(shù)據(jù)接收完成后,需要重新開啟監(jiān)聽
[sock readDataWithTimeout:-1 tag:0];
}
命令行顯示效果如下:

命令行演示效果.gif
新建一個(gè)IOS工程,添加CocoaAsyncSocket第三方庫
- 初始化的時(shí)候連接到服務(wù)器上
GCDAsyncSocket *clientSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_global_queue(0, 0)];
self.clientSocket = clientSocket;
NSError *error = nil;
[clientSocket connectToHost:@"127.0.0.1" onPort:30000 error:&error];
if (!error) {
NSLog(@"error:%@",error);
}
- 在代理方法中將收到的消息存儲(chǔ)起來,然后刷新顯示
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"收到數(shù)據(jù)%@",str);
// 將接收到的數(shù)據(jù)添加到數(shù)組中去
[self.chatContent addObject:str];
// 回到主線程刷新tablview
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
// 監(jiān)聽數(shù)據(jù)收發(fā)
[self.clientSocket readDataWithTimeout:-1 tag:0];
}
ios客戶端消息收發(fā)效果

ios客戶端消息收發(fā)效果.gif