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];