1.1-GCDScoket
- 该框架提供了一套底层API来处理这些过程
下载地址:https://github.com/robbiehanson/CocoaAsyncSocket
1.2-关于终端命令
查看ip和mac地址: arp -a
使用终端链接命令: 格式:telnet空格【ip地址】空格【端口号】 例如: telnet 127.0.0.1 1234
本机ip地址:127.0.0.1
端口号
总范围:0~65535
周知端口:0~1023 通常由Unix系统占用
注册端口:1025~49151 一般由系统自动分配
1024端口一般不固定分配给某个服务,在英文中的解释是“Reserved”(保留)。之前,我们曾经提到过动态端口的范围是从1024~65535,而1024正是动态端口的开始。该端口一般分配给第一个向系统发出申请的服务,在关闭服务的时候,就会释放1024端口,等待其他服务的调用
1.3-使用GCDSocket搭建mac端scoket服务器
#import "ViewController.h"
#import "GCDAsyncSocket.h"
@interface ViewController ()<GCDAsyncSocketDelegate>
@property (weak) IBOutlet NSTextField *postNumTextField;
//服务端GCDAsyncSocket
//
@property(nonatomic,strong)GCDAsyncSocket *serviceSocket;
//客户端的Socket
//
@property(nonatomic,strong)GCDAsyncSocket *clientSocket;
//保存多个客户端Socket
//
@property(nonatomic,strong)NSMutableArray<GCDAsyncSocket *> *clientArr;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
}
- (NSMutableArray<GCDAsyncSocket*>*)clientArr{
if (_clientArr != nil) {
return _clientArr;
}
_clientArr = [NSMutableArray array];
return _clientArr;
}
//懒加载服务端
-(GCDAsyncSocket*)serviceSocket{
if (_serviceSocket != nil) {
return _serviceSocket;
}
_serviceSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
return _serviceSocket;
}
- (void)setRepresentedObject:(id)representedObject {
[super setRepresentedObject:representedObject];
// Update the view, if already loaded.
}
- (IBAction)startButtonClick:(id)sender {
NSError *error = nil;
//开始监听端口号
[self.serviceSocket acceptOnPort:self.postNumTextField.intValue error:&error];
if (error == nil) {
NSLog(@"监听成功");
} else {
NSLog(@"监听失败");
}
}
#pragma mark - NSASCIIStringEncoding
//监听到新加入的客户端
- (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket{
// //需要强引用持有新的客户端socket 某则将会被释放导致无法连接
// self.clientSocket = newSocket;
// 将新的客户端添加到数组
[self.clientArr addObject:newSocket];
//读取该客户端数据 Timeout:等待时间 -1表示永久等待 tag是一个标记 没什么大作用
[newSocket readDataWithTimeout:-1 tag:0];
//给客户端发送数据
NSString *string = @"你知道我在等你吗?";
[newSocket writeData:[string dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0];
}
//接收数据
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{
NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",string);
//继续读取数据
[sock readDataWithTimeout:-1 tag:0];
//将接收的数据发送给其他的客户端
for (GCDAsyncSocket *otherSocket in self.clientArr) {
//过滤消息发送者本身
if (otherSocket != sock) {
[otherSocket writeData:[string dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0];
}
}
}
@end
1.4-使用terminal终端模拟客户端
- 调用命令 telnet 127.0.0.1 1234 相当于调用GCDSocket代码
//Socket连接服务器
[sock connectToHost:@"127.0.0.1" onPort:1234 error:nil];