GCDAsyncSocket-客戶端

//
//  ViewController.m
//  TestCocoaAsyncSocket
//
//  Created by dj on 2017/6/15.
//  Copyright ? 2017年 djlovettt. All rights reserved.
//

#import "ViewController.h"
#import "GCDAsyncSocket.h"

@interface ViewController ()<GCDAsyncSocketDelegate>

@property (nonatomic, strong) GCDAsyncSocket *clientSocket;
@property (nonatomic, strong) NSTimer *connectTimer;
@property (nonatomic, assign) BOOL connected;

@property (nonatomic, assign) NSInteger port;
@property (nonatomic, copy)   NSString *hostAddress;

@property (nonatomic, copy) NSString *sendMessage;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    _port = 8080;
    _hostAddress = @"192.***.1.***";
    _sendMessage = @"這是一條測試數(shù)據(jù)";
}

/**
 開始進行 socket 連接
 */
- (void)startConnect {
    if (!self.connected) {
        self.clientSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
        NSLog(@"開始進行 socket 連接");
        
        NSError *error = nil;
        self.connected = [self.clientSocket connectToHost:_hostAddress onPort:_port viaInterface:nil withTimeout:-1 error:&error];
        if (self.connected) {
            NSLog(@"正在嘗試連接");
        } else {
            NSLog(@"客戶端未創(chuàng)建連接");
        }
    } else {
        NSLog(@"socket 連接成功");
    }
}

/**
 向服務(wù)器端發(fā)送消息
 */
- (void)sendMessageAction {
    NSData *data = [_sendMessage dataUsingEncoding:NSUTF8StringEncoding];
    //withTimeout:-1 表示一直等待
    //tag 消息標記
    [self.clientSocket writeData:data withTimeout:-1 tag:0];
}

/**
 連接服務(wù)器對應(yīng)的端口號

 @param sock 客戶端的 socket
 @param host 主機 IP
 @param port 端口號
 */
- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port {
    //連接成功后開啟定時器
    [self addTimer];
    
    [self.clientSocket readDataWithTimeout:-1 tag:0];
    self.connected = YES;
}

- (void)addTimer {
    self.connectTimer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(longConnectToSocket) userInfo:nil repeats:YES];
    //將定時器添加到 runloop 里
    [[NSRunLoop currentRunLoop] addTimer:self.connectTimer forMode:NSRunLoopCommonModes];
}

- (void)longConnectToSocket {
    //發(fā)送固定內(nèi)容至服務(wù)器
    float version = [[UIDevice currentDevice] systemVersion].floatValue;
    NSString *versionStr = [NSString stringWithFormat:@"djlovett_%.2f",version];
    
    NSData *data = [versionStr dataUsingEncoding:NSUTF8StringEncoding];
    [self.clientSocket writeData:data withTimeout:-1 tag:0];
}

/**
 讀取接收到的數(shù)據(jù)

 @param sock 客戶端 socket
 @param data 接收到的數(shù)據(jù)
 @param tag  數(shù)據(jù)標記
 */
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {
    NSString *content = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"接收到的數(shù)據(jù)為 === %@",content);
    
    //讀取到服務(wù)器數(shù)據(jù)數(shù)值后,可以再次讀取
    [self.clientSocket readDataWithTimeout:-1 tag:0];
}

/**
 客戶端斷開連接

 @param sock 客戶端socket
 @param err  錯誤信息
 */
- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err {
    NSLog(@"socket 斷開連接");
    NSLog(@"錯誤信息描述: %@",err.localizedDescription);
    self.clientSocket.delegate = nil;
    self.clientSocket = nil;
    self.connected = NO;
    [self.connectTimer invalidate];
}

@end
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容