CocoaAsyncSocket支持tcp和udp。其中:AsyncSocket类是支持TCP的,AsyncUdpSocket是支持UDP的。AsyncSocket是封装了CFSocket和CFSteam的TCP/IP socket网络库。它提供了异步操作,本地cocoa类的基于delegate的完整支持。AsyncUdpSocket是UDP/IP socket网络库,包装自CFSocket。它的工作很像TCP版本,只不过是用于处理UDP的。
创建tcp服务器
//1、创建一个 GCDAsyncSocket 对象
self.socket =[[GCDAsyncSocket alloc]initWithDelegate:selfdelegateQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)];
//2、打开监听端口
NSError*error=nil;
[self.socket acceptOnPort:端口名 error:&error];
// 3. 判断端口号是否开放成功if (error == nil) {
NSLog(@"服务器开启成功");
}else{
NSLog(@"服务器开启失败");
}
当客户端链接服务器端的socket, 为客户端单生成一个newSocket,将客户端的连接保存起来
#pragma mark - GCDAsyncSocketDelegate
// 当客户端链接服务器端的socket, 为客户端单生成一个newSocket
- (void)socket:(GCDAsyncSocket*)sockdidAcceptNewSocket:(GCDAsyncSocket*)newSocket
{
//链接成功
//IP: newSocket.connectedHost
//端口号: newSocket.connectedPort
// short: %hd
// unsigned short: %hu
// 存储新的端口号
self.clientSocket= newSocket;
[self.clientSocket readDataWithTimeout:-1 tag:0];
}
读取信息
[newSocket readDataWithTimeout:-1 tag:0];//执行一次读取一次,可在接收消息后调用,这样可以连续接收消息
接收信息
- (void)socket:(GCDAsyncSocket*)sockdidReadData:(NSData*)data withTag:(long)tag
{
[self.clientSocket readDataWithTimeout:-1 tag:0];
NSString*message = [[NSStringalloc]initWithData:dataencoding:NSUTF8StringEncoding];
}
给客户端发送消息
NSData*data = [
[string dataUsingEncoding:NSUTF8StringEncoding];
[self.clientSocket writeData:datawithTimeout:-1tag:0];
客户端TCP链接
链接服务器
NSString *host = @"192.168.1.60";//服务器IP
UInt32 port = 54321;//端口
// 1. 创建socket
self.socket= [[GCDAsyncSocket alloc]initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
// 2. 与服务器的socket链接起来
NSError*error =nil;
BOOLresult = [self.socket connectToHost:host onPort:port error:&error];
// 3. 判断链接是否成功
if(result) {
[NSLog:@"客户端链接服务器成功"];
}else{
[NSLog:@"客户端链接服务器失败"];
}
接收数据
[self.socket readDataWithTimeout:-1 tag:0];//启动一次只能接收到一次消息
发送消息
[self.socket writeData:[string dataUsingEncoding:NSUTF8StringEncoding]withTimeout:-1 tag:0];
接收链接服务器和消息的代理方法
#pragma mark - GCDAsyncSocketDelegate
// 客户端链接服务器端成功, 客户端获取地址和端口号
- (void)socket:(GCDAsyncSocket*)sock didConnectToHost:(NSString*)host port:(uint16_t)port
{
[self.socket readDataWithTimeout:-1 tag:0];
}
// 客户端已经获取到内容
- (void)socket:(GCDAsyncSocket*)sockdidReadData:(NSData*)datawithTag:(long)tag
{
[self.socket readDataWithTimeout:-1 tag:0];
NSString*content = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
}
网友评论