iOS之GCDAsyncSocket(TCP)

上周周末的時候發(fā)燒了,就擔誤了寫博客,這周就多寫點吧。

這次主要講下Socket,關(guān)于它的三次握手、四次揮手什么的已經(jīng)寫的很多了,也寫的很好,我就不寫了。但注釋代碼時會穿插些Socket原理進去,當然也會提供Demo。

TCP Socket Server

#import "GCDAysncSocket.h"遵守協(xié)議<GCDAsyncSocketDelegate>

創(chuàng)建一個socket:
self.serverSocket = [[GCDAsyncSocket alloc]initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
監(jiān)聽端口:
    NSError * error = nil;
    [self.serverSocket acceptOnPort:[self.portTextField.text integerValue] error:&error];
等待連接://此為GCDAsyncSocket代理方法
- (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket
{
    //這里需要對Socket的工作原理進行一點解釋,當Socket accept一個連接服務(wù)請求時,將生成一個新的Socket,即此處的newSocket。在此可查看newSocket.connectedHost和newSocket.connectedPort等參數(shù),并通過新的socket向客戶端發(fā)送一包數(shù)據(jù)后會關(guān)閉你一開始創(chuàng)建的socket(self.serverSocket),接下來你都將使用newSocket(我將此保存為self.clientSocket)
    self.clientSocket = newSocket;
}
連接失敗://此為GCDAsyncSocket代理方法
- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err;
{
    NSLog(@"連接失敗,要怎么做,你自己看著辦吧");
}
連接成功,發(fā)送數(shù)據(jù)
//注意此處使用的是上面的newSocket
[self.clientSocket writeData:[self.sendTextView.text dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0];
    //我創(chuàng)建了一個Socket單例,這里只討論Socket,單例創(chuàng)建可看Demo
    SocketManager * socketManager = [SocketManager sharedSocketManager];
    [socketManager.mySocket readDataWithTimeout:-1 tag:0];
對發(fā)送的數(shù)據(jù)根據(jù)tag進行管理://此為GCDAsyncSocket代理方法
- (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag
{
    NSLog(@"可通過參數(shù)中的tag值管理發(fā)送的數(shù)據(jù),想怎么管理,您看著辦");
}
連接成功,接收數(shù)據(jù)
    //同樣使用的是newSocket
    [self.clientSocket readDataWithTimeout:-1 tag:0];
接收數(shù)據(jù)成功,處理數(shù)據(jù)://此為GCDAsyncSocket代理方法
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
    NSLog(@"接收到消息%@,要怎么處理,您看著辦",data);
}

這是服務(wù)器Demo,歡迎大家Star


TCP Socket Client

#import "GCDAysncSocket.h"遵守協(xié)議<GCDAsyncSocketDelegate>

創(chuàng)建Socket:
self.clientSocket = [[GCDAsyncSocket alloc]initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
連接服務(wù)器:
    NSError * error = nil;
    [self.clientSocket connectToHost:self.ipTextField.text onPort:[self.portTextField.text integerValue] error:&error];
連接成功://此處為GCDAsyncSocket代理方法
- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port
{
    //創(chuàng)建的socket單例
    SocketManager * socketManager = [SocketManager sharedSocketManager];
    socketManager.mySocket = sock;
}
連接失敗://此處為GCDAsyncSocket代理方法
- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err
{
    NSLog(@"自己看著辦");
}
連接成功,發(fā)送數(shù)據(jù)
    [self.clientSocket writeData:[self.sendTextView.text dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0];
連接成功,接收數(shù)據(jù)
    [self.clientSocket readDataWithTimeout:-1 tag:0];
接收數(shù)據(jù)成功,處理數(shù)據(jù)://此處為GCDAsyncSocket代理方法
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
    NSLog(@"接收到消息%@,要怎么處理,您看著辦",data);
}

到此處就結(jié)束了,大家可以發(fā)現(xiàn),客戶端這邊從頭到尾都是使用的一個Socket,并沒有出現(xiàn)新的Socket,這一點是需要注意的。客戶端Demo,歡迎大家Star.

版權(quán)聲明:本文為 Crazy Steven 原創(chuàng)出品,歡迎轉(zhuǎn)載,轉(zhuǎn)載時請注明出處!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載:http://www.cocoachina.com/ios/20170615/19529.html 參考:h...
    F麥子閱讀 4,042評論 3 2
  • 本人有若干成套學(xué)習(xí)視頻, 可試看! 可試看! 可試看, 重要的事情說三遍 包含Java, 數(shù)據(jù)結(jié)構(gòu)與算法, iOS...
    小冰山口閱讀 1,119評論 5 4
  • iPhone的標準推薦是CFNetwork 庫編程,其封裝好的開源庫是 cocoa AsyncSocket庫,用它...
    Ethan_Struggle閱讀 2,282評論 2 12
  • 國家電網(wǎng)公司企業(yè)標準(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 11,176評論 6 13
  • 杞人者,吾友王兄恩御,定遠人氏。淮北師范大學(xué)教授,今卜居淮安。君心系古學(xué),能詩善飲,雖與我相距遙遠,卻時有...
    丁懷超閱讀 284評論 1 3