上周周末的時候發(fā)燒了辜羊,就擔(dān)誤了寫博客刽射,這周就多寫點吧轻掩。
這次主要講下Socket,關(guān)于它的三次握手织咧、四次揮手什么的已經(jīng)寫的很多了,也寫的很好,我就不寫了。但注釋代碼時會穿插些Socket原理進去,當(dāng)然也會提供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的工作原理進行一點解釋笙蒙,當(dāng)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.