公司需要使用socket連接server服務(wù)器來獲取所需要的數(shù)據(jù)骚露, 用以前的http代替县恕,github中又一個(gè)第三方框架CocoaAsyncSocket,里面含有了TCP/IP協(xié)議龙致,和UDP協(xié)議掰茶, 現(xiàn)在只需要TCP/IP,就可以只研究里面的代理方法作用橄抹。
一靴迫、導(dǎo)入CocoaAsyncSocket第三方庫
1、打開項(xiàng)目工程中的Pofile文件楼誓, 輸入 pod 'CocoaAsyncSocket'
2玉锌、打開終端 cd空格到當(dāng)前的項(xiàng)目工程路徑中
3、pod install安裝第三方庫
二連接服務(wù)器發(fā)送數(shù)據(jù)
1疟羹、創(chuàng)建一個(gè)socket
.h
@property (nonatomic, strong) GCDAsyncSocket *tcpServer;
.m
self.tcpServer =[[GCDAsyncSocket alloc]initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
(記得簽署代理協(xié)議<GCDAsyncSocketDelegate>)
2主守、連接你的服務(wù)器,代碼如下
//錯(cuò)誤
NSError *error = nil;
//建立長鏈接發(fā)送心跳包
if (![self.tcpServer connectToHost:@"服務(wù)器地址" onPort:@"服務(wù)器端口" error:&error]) {
UIAlertController*alert = [UIAlertController alertControllerWithTitle:@"TCP錯(cuò)誤" message:error.localizedDescription preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction* sure = [UIAlertAction actionWithTitle:@"確定" style:UIAlertActionStyleDefault
handler:nil];
[alert addAction:sure];
//失敗以后重新連接
[self disableUserInterfaceAfterConnected];
return;
}
UIAlertController*alert = [UIAlertController alertControllerWithTitle:@"TCP通道" message:@"通道連接成功" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction* sure = [UIAlertAction actionWithTitle:@"確定" style:UIAlertActionStyleDefault
handler:nil];
[alert addAction:sure];
[self presentViewController:alert animated:YES completion:nil];
[self disableUserInterfaceAfterConnected];
}
3榄融、連接成功代理回調(diào)
pragma mark -- TCP Delegate
//連接成功回調(diào)参淫,心跳計(jì)時(shí),定時(shí)向服務(wù)器發(fā)送請求愧杯,保持連接
- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port {
NSLog(@"socket連接成功");
}
成功連接以后涎才,我們可以獲取sockrt對象一個(gè)服務(wù)器的IP和端口,可以立馬處理執(zhí)行一些事情力九,也可以開啟心跳數(shù)據(jù)包耍铜,讓服務(wù)器一只可以確認(rèn)你的存在。
4跌前、向服務(wù)器發(fā)送SQL語句棕兼,在這里因?yàn)樾枰獙Πl(fā)送的數(shù)據(jù)進(jìn)行了轉(zhuǎn)碼和壓縮,代碼如下:
NSStringEncoding gbkEncoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
//數(shù)據(jù)換成GBK
NSData* dataStream = [@"需要發(fā)送的SQL語句" dataUsingEncoding:gbkEncoding];
zipAndUnzip* zipTools = [[zipAndUnzip alloc]init];
// 壓縮后的數(shù)據(jù)dataZip
NSData* dataZip = [zipTools zlibDeflate:dataStream];
//向服務(wù)器發(fā)送內(nèi)容
[self.tcpServer writeData:dataZip withTimeout:1 tag:1];
5抵乓、務(wù)必記得伴挚,不管你要在此處做什么工作,都要加上一句話
[socket readDataWithTimeout:1 tag:1];
這句話意思就是調(diào)用讀取數(shù)據(jù)的代理方法灾炭。需要手動加入這句話章鲤,不然didReadData代理方法不執(zhí)行
/*
- 兩個(gè)參數(shù)的意思 : timeOut :-1 。 永遠(yuǎn)不會超時(shí)
*tag: 該次讀取與其他讀取的標(biāo)志咆贬,通常我們在設(shè)計(jì)視圖上的控件時(shí)也會有這樣的一個(gè)屬性就是tag
*/
----現(xiàn)在我們連接動作算是完整的做完了, 接下來就是和服務(wù)器的交互處理了帚呼!也就是讀寫操作掏缎。 通訊畢竟是為了傳輸數(shù)據(jù)皱蹦。
三、讀取數(shù)據(jù)解析數(shù)據(jù)
1眷蜈、解析服務(wù)器向你返回的字符串---先解壓縮再轉(zhuǎn)碼
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {
//設(shè)置data收到的最大長度
[self.tcpServer readDataToLength:[GCDAsyncSocket CRLFData].length withTimeout:-1 tag:0];
//對得到的data值進(jìn)行解析與轉(zhuǎn)換
zipAndUnzip* zipTools = [[zipAndUnzip alloc]init];
// 壓縮后的數(shù)據(jù)dataZip
NSData* dataZip = [zipTools zlibInflate:data];
NSStringEncoding gbkEncoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
NSString* readData = [[NSString alloc]initWithData:dataZip encoding:gbkEncoding];
//接下來 根據(jù)不同的需求解壓不同的數(shù)據(jù)
沪哺。。酌儒。辜妓。
}
參考鏈接: https://www.cnblogs.com/yyt-hehe-yyt/p/5284445.html
參考鏈接:
http://www.reibang.com/p/8ad92f31dbfb
有任何疑問或者技術(shù)大牛,請指點(diǎn)
qq郵箱:923782052@qq.cm