socket 套接字, 是基于TCP UDP 协议的 一种通信机制, 它本身就是对TCP 和UDp 协议应用的一种管理
iOS中 socket 通信
1,我们使用第三方库AsyncSocket
准备工作
1, 把AsyncSocket 加入到我们的工程, 这个玩意 一般是手动的, 如果你使用的是自动的, 需要再变异的时候 添加 fno-objec-arc
2, 使用第三方库, 我们需要添加一个类库,CFNetwork.framework
2, 准备工作完成后, 我们下面了解下ios 中socket 的通信 是怎么完成的
1, socket 通信, 首先 有两个端 : 客户端 和 服务端
2, 服务端的工作: 声明一个socket, 因为两个终端的通信, 必须绑定一个端口, 所以 下一步 是绑定端口, 再下一步就是监听端口, 当监听的链接请求的时候, 建立链接成功后, 然后就阻塞 等待客户端发送数据
3, 客户端: 声明一个socket, 第二步 连接指定ip, 和端口, 第三步: 发送数据
示例:
TCP
服务端:
1, 遵守协议(别忘了遵守协议), 然后声明
_recvSocket= [[AsyncSocketalloc]initWithDelegate:self];
2, 绑定端口
//监听客户端来连接
[_recvSocketacceptOnPort:5678error:nil];
3, 监听连接, 当有链接请求的时候, 调用此方法并把socket 存到数组 保存起来, 因为TCP 是长连接
[objc]view plaincopy
- (void)onSocket:(AsyncSocket*)sockdidAcceptNewSocket:(AsyncSocket*)newSocket{
[_socketArrayaddObject:newSocket];
//等待客户端 发送消息 -1 是永远等待
[newSocketreadDataWithTimeout:-1tag:0];
}
4, 等待客户端发送消息, 接受客户端发送消息时触发,
[objc]view plaincopy
// 监听到客户端发送消息
- (void)onSocket:(AsyncSocket*)sockdidReadData:(NSData*)datawithTag:(long)tag{
// 继续监听 客户端 发来的消息, 形成循环监听
[sockreadDataWithTimeout:-1tag:0];
}
客户端:
1, 声明
[objc]view plaincopy
//---客户端
_sendSocket = [[AsyncSocketalloc]initWithDelegate:self];
2, 连接服务端
[objc]view plaincopy
//-----客户端
//连接至服务端
- (void)conToHost:(id)sender{
//如果是连接状态, 先断开连接
if(_sendSocket.isConnected) {
[_sendSocketdisconnect];
}
//连接
[_sendSocketconnectToHost:_ipField.textonPort:5678withTimeout:30error:nil];
}
3, 发送消息
[objc]view plaincopy
[_sendSocketwriteData:doc.XMLDatawithTimeout:30tag:0];
以下两个方法 服务端 和 客户端 都会调用
[objc]view plaincopy
// 作为服务器的时候, 有人断开连接 ,会调用此方法
//最为客户端 断开连接服务器的时候 也会调用此方法
//断开链接的时候, 别人与你断开连接的时候也会调用
- (void)onSocketDidDisconnect:(AsyncSocket*)sock{
NSLog(@"断开连接");
// [_socketArray removeObject:sock];
}
[objc]view plaincopy
// 作为服务器的时候, 有人连接成功 ,会调用此方法
//最为客户端 连接成功服务器的时候 也会调用此方法
// 连接成功, 这个客户端 和服务端 都会调用这个方法, 别人链接我的时候 链接成功的时候, 会调用此方法, 我主动链接别人的服务端的时候, 如果连接成功 会调用两次这个方法
- (void)onSocket:(AsyncSocket*)sockdidConnectToHost:(NSString*)hostport:(UInt16)port{
NSLog(@"连接成功%@", host);
}
UDP 通信示例:
因为UDP 发送消息 实现不需要建立连接, 这比TCP 简便多了, UDP 就一个监听接收消息端口的 函数 即可, 比较简单
服务端
1, socket 声明, 并制定委托
[objc]view plaincopy
//服务端
_recvSocket = [[AsyncUdpSocketalloc]initWithDelegate:self];
2, 绑定 监听的端口
[objc]view plaincopy
//绑定一个端口
[_recvSocketbindToPort:6789error:nil];
3, 开始监听 接受消息的端口
[objc]view plaincopy
//开始监听接收消息
[_recvSocketreceiveWithTimeout:-1tag:0];
4, 监听到消息 调用的函数
[objc]view plaincopy
//接收到消息, HOST:发送端的ip
- (BOOL)onUdpSocket:(AsyncUdpSocket*)sockdidReceiveData:(NSData*)datawithTag:(long)tagfromHost:(NSString*)hostport:(UInt16)port{
....
//继续监听 接收消息
[_recvSocketreceiveWithTimeout:-1tag:0];
returnYES;
}
客户端
1
[objc]view plaincopy
//发送端
_sendSocket = [[AsyncUdpSocketalloc]initWithDelegate:self];
[_sendSocketbindToPort:6789error:nil];
2, 发送 , 里面的参数 需要指定 发送目的ip 端口 超时时间等
[objc]view plaincopy
[_sendSocketsendData:doc.XMLDatatoHost:_ipTextfiled.textport:6789withTimeout:30tag:0];