iOS:基於Socket的第三方框架CocoaAsyncSocket的使用


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上的。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM