上周周末的時候發(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.