IOS socket 通信机制的实现
2014-11-24 23:12 44人阅读 评论(0) 收藏 举报
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, 遵守协议(别忘了遵守协议<AsyncSocketDelegate>), 然后声明
_recvSocket = [[AsyncSocketalloc]initWithDelegate:self];
2, 绑定端口
//监听客户端来连接
[_recvSocketacceptOnPort:5678error:nil];
3, 监听连接, 当有链接请求的时候, 调用此方法 并把socket 存到数组 保存起来, 因为TCP 是长连接
[objc] view plaincopy
- - (void)onSocket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newSocket{
- [_socketArray addObject:newSocket];
- //等待客户端 发送消息 -1 是永远等待
- [newSocket readDataWithTimeout:-1 tag:0];
- }
4, 等待客户端发送消息, 接受客户端发送消息时触发,
[objc] view plaincopy
- <pre name="code" class="objc">// 监听到客户端发送消息
- - (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{
- // 继续监听 客户端 发来的消息, 形成循环监听
- [sock readDataWithTimeout:-1 tag:0];
- }
客户端:
1, 声明
[objc] view plaincopy
- //---客户端
- _sendSocket = [[AsyncSocket alloc] initWithDelegate:self];
2, 连接服务端
[objc] view plaincopy
- //-----客户端
- //连接至服务端
- - (void)conToHost:(id)sender{
- //如果是连接状态, 先断开连接
- if (_sendSocket.isConnected) {
- [_sendSocket disconnect];
- }
- //连接
- [_sendSocket connectToHost:_ipField.text onPort:5678 withTimeout:30 error:nil];
- }
3, 发送消息
[objc] view plaincopy
- [_sendSocket writeData:doc.XMLData withTimeout:30 tag:0];
以下两个方法 服务端 和 客户端 都会调用
[objc] view plaincopy
- // 作为服务器的时候, 有人断开连接 ,会调用此方法
- //最为客户端 断开连接服务器的时候 也会调用此方法
- //断开链接的时候, 别人与你断开连接的时候也会调用
- - (void)onSocketDidDisconnect:(AsyncSocket *)sock{
- NSLog(@"断开连接");
- // [_socketArray removeObject:sock];
- }
[objc] view plaincopy
- // 作为服务器的时候, 有人连接成功 ,会调用此方法
- //最为客户端 连接成功服务器的时候 也会调用此方法
- // 连接成功, 这个客户端 和服务端 都会调用这个方法, 别人链接我的时候 链接成功的时候, 会调用此方法, 我主动链接别人的服务端的时候, 如果连接成功 会调用两次这个方法
- - (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port{
- NSLog(@"连接成功%@", host);
- }
UDP 通信示例:
因为UDP 发送消息 实现不需要建立连接, 这比TCP 简便多了, UDP 就一个监听接收消息端口的 函数 即可, 比较简单
服务端
1, socket 声明, 并制定委托
[objc] view plaincopy
- //服务端
- _recvSocket = [[AsyncUdpSocket alloc] initWithDelegate:self];
2, 绑定 监听的端口
[objc] view plaincopy
- //绑定一个端口
- [_recvSocket bindToPort:6789 error:nil];
3, 开始监听 接受消息的端口
[objc] view plaincopy
- //开始监听接收消息
- [_recvSocket receiveWithTimeout:-1 tag:0];
4, 监听到消息 调用的函数
[objc] view plaincopy
- //接收到消息, HOST:发送端的ip
- - (BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag fromHost:(NSString *)host port:(UInt16)port{
- ....
- //继续监听 接收消息
- [_recvSocket receiveWithTimeout:-1 tag:0];
- return YES;
- }
IOS socket 通信机制的实现
2014-11-24 23:12 44人阅读 评论(0) 收藏 举报
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, 遵守协议(别忘了遵守协议<AsyncSocketDelegate>), 然后声明
_recvSocket = [[AsyncSocketalloc]initWithDelegate:self];
2, 绑定端口
//监听客户端来连接
[_recvSocketacceptOnPort:5678error:nil];
3, 监听连接, 当有链接请求的时候, 调用此方法 并把socket 存到数组 保存起来, 因为TCP 是长连接
[objc] view plaincopy
- - (void)onSocket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newSocket{
- [_socketArray addObject:newSocket];
- //等待客户端 发送消息 -1 是永远等待
- [newSocket readDataWithTimeout:-1 tag:0];
- }
4, 等待客户端发送消息, 接受客户端发送消息时触发,
[objc] view plaincopy
- <pre name="code" class="objc">// 监听到客户端发送消息
- - (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{
- // 继续监听 客户端 发来的消息, 形成循环监听
- [sock readDataWithTimeout:-1 tag:0];
- }
客户端:
1, 声明
[objc] view plaincopy
- //---客户端
- _sendSocket = [[AsyncSocket alloc] initWithDelegate:self];
2, 连接服务端
[objc] view plaincopy
- //-----客户端
- //连接至服务端
- - (void)conToHost:(id)sender{
- //如果是连接状态, 先断开连接
- if (_sendSocket.isConnected) {
- [_sendSocket disconnect];
- }
- //连接
- [_sendSocket connectToHost:_ipField.text onPort:5678 withTimeout:30 error:nil];
- }
3, 发送消息
[objc] view plaincopy
- [_sendSocket writeData:doc.XMLData withTimeout:30 tag:0];
以下两个方法 服务端 和 客户端 都会调用
[objc] view plaincopy
- // 作为服务器的时候, 有人断开连接 ,会调用此方法
- //最为客户端 断开连接服务器的时候 也会调用此方法
- //断开链接的时候, 别人与你断开连接的时候也会调用
- - (void)onSocketDidDisconnect:(AsyncSocket *)sock{
- NSLog(@"断开连接");
- // [_socketArray removeObject:sock];
- }
[objc] view plaincopy
- // 作为服务器的时候, 有人连接成功 ,会调用此方法
- //最为客户端 连接成功服务器的时候 也会调用此方法
- // 连接成功, 这个客户端 和服务端 都会调用这个方法, 别人链接我的时候 链接成功的时候, 会调用此方法, 我主动链接别人的服务端的时候, 如果连接成功 会调用两次这个方法
- - (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port{
- NSLog(@"连接成功%@", host);
- }
UDP 通信示例:
因为UDP 发送消息 实现不需要建立连接, 这比TCP 简便多了, UDP 就一个监听接收消息端口的 函数 即可, 比较简单
服务端
1, socket 声明, 并制定委托
[objc] view plaincopy
- //服务端
- _recvSocket = [[AsyncUdpSocket alloc] initWithDelegate:self];
2, 绑定 监听的端口
[objc] view plaincopy
- //绑定一个端口
- [_recvSocket bindToPort:6789 error:nil];
3, 开始监听 接受消息的端口
[objc] view plaincopy
- //开始监听接收消息
- [_recvSocket receiveWithTimeout:-1 tag:0];
4, 监听到消息 调用的函数
[objc] view plaincopy
- //接收到消息, HOST:发送端的ip
- - (BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag fromHost:(NSString *)host port:(UInt16)port{
- ....
- //继续监听 接收消息
- [_recvSocket receiveWithTimeout:-1 tag:0];
- return YES;
- }
客户端
1
[objc] view plaincopy
- //发送端
- _sendSocket = [[AsyncUdpSocket alloc] initWithDelegate:self];
- [_sendSocket bindToPort:6789 error:nil];
2, 发送 , 里面的参数 需要指定 发送目的ip 端口 超时时间等
[objc] view plaincopy
[_sendSocket sendData:doc.XMLData toHost:_ipTextfiled.text port:6789 withTimeout:30 tag:0];
客户端
1
[objc] view plaincopy
- //发送端
- _sendSocket = [[AsyncUdpSocket alloc] initWithDelegate:self];
- [_sendSocket bindToPort:6789 error:nil];
2, 发送 , 里面的参数 需要指定 发送目的ip 端口 超时时间等
[objc] view plaincopy
[_sendSocket sendData:doc.XMLData toHost:_ipTextfiled.text port:6789 withTimeout:30 tag:0];