CocoaAsyncSocket無疑是目前封裝得最完善的Socket庫了:支持異步TCP/UDP,支持GCD,Objective-C接口封裝,同時還有日志跟蹤功能,使用此日志跟蹤,程序員可以很方便的進行調試。
文件如下:
如果想打開日志調試,很簡單,導入需要的DDASLLogger.h頭文件,創建DDASLLogger單利對象就可以了。
簡單的演示如下:
1.在故事版布局
2.在ViewController.h文件中
// ViewController.h // AysnSocket #import <UIKit/UIKit.h> #import "AsyncSocket.h" @interface ViewController : UIViewController { NSMutableArray *_scokets; //存放客戶端的可變數組 AsyncSocket *_sendSocket; //發送端 AsyncSocket *_receScoket; //接收端 } @end
3.在ViewController.m文件中
// ViewController.m // AysnSocket #import "ViewController.h" #import "AsyncSocket.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UITextView *msgView; @property (weak, nonatomic) IBOutlet UITextField *ipField; @property (weak, nonatomic) IBOutlet UITextField *sendField; - (IBAction)coneClicked:(UIButton *)sender; //連接服務器 - (IBAction)sendClicked:(UIButton *)sender; //發送端發送消息 - (IBAction)disConeClicked:(UIButton *)sender; //斷開連接 @end @implementation ViewController @synthesize msgView; @synthesize ipField; @synthesize sendField; - (void)viewDidLoad { [super viewDidLoad]; //1.初始化scokets數組,存儲新的客戶端scoket _scokets = [NSMutableArray array]; //2.實例化發送端和接收端 _sendSocket = [[AsyncSocket alloc]initWithDelegate:self]; _receScoket = [[AsyncSocket alloc]initWithDelegate:self]; //3.接收端開始監聽網絡 NSError *error; [_receScoket acceptOnPort:8888 error:&error]; } #pragma mark - 代理方法 //接受到新的scoket - (void)onSocket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newSocket { //將新接收到的socket加入數組中 [_scokets addObject:newSocket]; //開始接受數據 [newSocket readDataWithTimeout:-1 tag:0]; } //接收端收到信息 - (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag { //接收數據 NSString *string = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]; //格式化數據 self.msgView.text = [NSString stringWithFormat:@"%@,%@,%@",self.msgView.text,self.ipField.text,string]; //循環讀取 [sock readDataWithTimeout:-1 tag:0]; } //連接服務器成功 - (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port { NSLog(@"%@",host); NSLog(@"連接服務器成功"); } //斷開服務器成功 -(void)onSocketDidDisconnect:(AsyncSocket *)sock { NSLog(@"斷開連接成功"); } #pragma mark - 按鈕事件 //建立連接 - (IBAction)coneClicked:(UIButton *)sender { if (_sendSocket.isConnected) { [_sendSocket disconnect]; } //客戶端重新連接到主機 [_sendSocket connectToHost:self.ipField.text onPort:8888 withTimeout:30 error:nil]; } //發送消息 - (IBAction)sendClicked:(UIButton *)sender { //客戶端發送數據 NSData *data = [self.sendField.text dataUsingEncoding:NSUTF8StringEncoding]; [_sendSocket writeData:data withTimeout:30 tag:0]; //清空數據 self.sendField.text = @""; } //斷開服務器 - (IBAction)disConeClicked:(UIButton *)sender { if (_sendSocket.isConnected) { [_sendSocket disconnect]; } } @end
測試如下:
(1)打開電腦的網絡設置,看一下ip和設置端口為8888
(2)運行程序,在演示中輸入ip和消息
一開始: 輸入ip和消息,然后連接服務器
連接成功服務器成功 發送消息,數據發送成功
斷開服務器:
斷開服務器后,再嘗試發送數據,是無法發送並顯示在UITextView上的。