//
// 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
GCDAsyncSocket-客戶端
最后編輯于 :
?著作權(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ù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- packagework11; importjava.io.*; importjava.net.*; public ...
- 1)資源方面:200個客戶在1臺客戶端會占用很多資源 2)線程方面:200個客戶在1臺客戶端會產(chǎn)生線程干擾 3)帶...
- 前奏:socket兩套庫,GCDAsyncSocket,GCDAsyncUdpSocket和AsyncSocket...
- 記錄是一種精神,是加深理解最好的方式之一。 最近深入研究了Jedis的源碼,對Jedis的使用進行深入理解,提筆記...