? ? ? CocoaAsyncSocket支持tcp和udp。其中:AsyncSocket類是支持TCP的,AsyncUdpSocket是支持UDP的。AsyncSocket是封裝了CFSocket和CFSteam的TCP/IP socket網(wǎng)絡(luò)庫(kù)。它提供了異步操作,本地cocoa類的基于delegate的完整支持。AsyncUdpSocket是UDP/IP socket網(wǎng)絡(luò)庫(kù),包裝自CFSocket。它的工作很像TCP版本,只不過(guò)是用于處理UDP的。
創(chuàng)建tcp服務(wù)器
//1、創(chuàng)建一個(gè) GCDAsyncSocket 對(duì)象
self.socket =[[GCDAsyncSocket alloc]initWithDelegate:selfdelegateQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)];
//2、打開(kāi)監(jiān)聽(tīng)端口
NSError*error=nil;
[self.socket acceptOnPort:端口名 error:&error];
// 3. 判斷端口號(hào)是否開(kāi)放成功if (error == nil) {
NSLog(@"服務(wù)器開(kāi)啟成功");
}else{
NSLog(@"服務(wù)器開(kāi)啟失敗");
}
當(dāng)客戶端鏈接服務(wù)器端的socket, 為客戶端單生成一個(gè)newSocket,將客戶端的連接保存起來(lái)
#pragma mark - GCDAsyncSocketDelegate
// 當(dāng)客戶端鏈接服務(wù)器端的socket, 為客戶端單生成一個(gè)newSocket
-?(void)socket:(GCDAsyncSocket*)sockdidAcceptNewSocket:(GCDAsyncSocket*)newSocket
{
//鏈接成功
//IP:?newSocket.connectedHost
//端口號(hào):?newSocket.connectedPort
//?short:?%hd
//?unsigned?short:?%hu
//?存儲(chǔ)新的端口號(hào)
self.clientSocket=?newSocket;
[self.clientSocket readDataWithTimeout:-1 tag:0];
}
讀取信息
[newSocket readDataWithTimeout:-1 tag:0];//執(zhí)行一次讀取一次,可在接收消息后調(diào)用,這樣可以連續(xù)接收消息
接收信息
- (void)socket:(GCDAsyncSocket*)sockdidReadData:(NSData*)data withTag:(long)tag
{
[self.clientSocket readDataWithTimeout:-1 tag:0];
NSString*message?=?[[NSStringalloc]initWithData:dataencoding:NSUTF8StringEncoding];
}
給客戶端發(fā)送消息
NSData*data = [
[string dataUsingEncoding:NSUTF8StringEncoding];
[self.clientSocket writeData:datawithTimeout:-1tag:0];
客戶端TCP鏈接
鏈接服務(wù)器
NSString *host = @"192.168.1.60";//服務(wù)器IP
UInt32 port = 54321;//端口
// 1. 創(chuàng)建socket
self.socket=?[[GCDAsyncSocket alloc]initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
//?2.?與服務(wù)器的socket鏈接起來(lái)
NSError*error?=nil;
BOOLresult = [self.socket connectToHost:host onPort:port error:&error];
//?3.?判斷鏈接是否成功
if(result)?{
[NSLog:@"客戶端鏈接服務(wù)器成功"];
}else{
[NSLog:@"客戶端鏈接服務(wù)器失敗"];
}
接收數(shù)據(jù)
[self.socket readDataWithTimeout:-1 tag:0];//啟動(dòng)一次只能接收到一次消息
發(fā)送消息
[self.socket writeData:[string dataUsingEncoding:NSUTF8StringEncoding]withTimeout:-1 tag:0];
接收鏈接服務(wù)器和消息的代理方法
#pragma mark - GCDAsyncSocketDelegate
//?客戶端鏈接服務(wù)器端成功,?客戶端獲取地址和端口號(hào)
-?(void)socket:(GCDAsyncSocket*)sock didConnectToHost:(NSString*)host port:(uint16_t)port
{
? ? [self.socket readDataWithTimeout:-1 tag:0];
}
//?客戶端已經(jīng)獲取到內(nèi)容
-?(void)socket:(GCDAsyncSocket*)sockdidReadData:(NSData*)datawithTag:(long)tag
{
[self.socket readDataWithTimeout:-1 tag:0];
NSString*content?=?[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
}