0x01 Server端
#import "GCDAsyncSocket.h"
@interface ViewController ()<GCDAsyncSocketDelegate>
@end
@implementation ViewController{
GCDAsyncSocket *_serverSocket;
dispatch_queue_t _golbalQueue;
NSMutableArray *_clientSocket;
}
- (void)initServer{
if (!_serverSocket) {
_clientSocket = [NSMutableArray array];
_golbalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
_serverSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:_golbalQueue];
}
NSLog(@"server inited");
}
- (void)startChatServer{
NSError *error;
[_serverSocket acceptOnInterface:@"192.168.50.128" port:2333 error:
if (error) {
NSLog(@"服务器开启失败 error is %@",error);
}else{
NSLog(@"服务器开启成功");
[_serverSocket enableBackgroundingOnSocket];
}
}
#pragma mark 有客户端建立连接的时候调用
-(void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket{
NSLog(@"new clientSocket Ip is %@",newSocket.connectedHost);
[_clientSocket addObject:newSocket];
[newSocket readDataWithTimeout:-1 tag:100];
}
#pragma mark - GCDAsyncSocketDelegate
-(void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag{
[sock readDataWithTimeout:-1 tag:100];
}
#pragma mark - GCDAsyncSocketDelegate
-(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{
NSString *receiverStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"服务端收到的数据:%@",receiverStr);
[sock writeData:[@"mes received" dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0];
}
0x02 客户端 (Client)
@interface ViewController ()<NSStreamDelegate>
@property (weak, nonatomic) IBOutlet UITextField *mesTextField;
@end
@implementation ViewController{
NSInputStream *_inputStream;
NSOutputStream *_outputStream;
}
- (void)connectServer{
NSString *host = @"192.168.50.128";
int port = 2333;
CFReadStreamRef readStreamRef;
CFWriteStreamRef writeStreamRef;
CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)host, port, &readStreamRef, &writeStreamRef);
_inputStream = (__bridge NSInputStream *)(readStreamRef);
_outputStream = (__bridge NSOutputStream *)(writeStreamRef);
_inputStream.delegate = self;
_outputStream.delegate = self;
[_inputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
[_outputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
[_inputStream open];
[_outputStream open];
}
- (IBAction)sendMes:(id)sender {
NSString *msg = self.mesTextField.text;
NSData *msgData = [msg dataUsingEncoding:NSUTF8StringEncoding];
[_outputStream write:msgData.bytes maxLength:msgData.length];
self.mesTextField.text = @"";
NSLog(@"客户端发送消息:%@",msg);
}
#pragma MARK - NSStreamDelegate
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode{
switch(eventCode) {
case NSStreamEventOpenCompleted:
NSLog(@"客户端输入输出流打开完成");
break;
case NSStreamEventHasBytesAvailable:
NSLog(@"客户端有字节可读");
[self readData];
break;
case NSStreamEventHasSpaceAvailable:
NSLog(@"客户端可以发送字节");
break;
case NSStreamEventErrorOccurred:
NSLog(@"客户端连接出现错误");
break;
case NSStreamEventEndEncountered:
NSLog(@"客户端连接结束");
[_inputStream close];
[_outputStream close];
[_inputStream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
[_outputStream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
break;
default:
break;
}
}
-(void)readData{
uint8_t buf[1024];
NSInteger len = [_inputStream read:buf maxLength:sizeof(buf)];
NSData *data =[NSData dataWithBytes:buf length:len];
NSString *recStr =[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"Socket:读取从服务端发来的消息:%@",recStr);
}