zoukankan      html  css  js  c++  java
  • socket 通信机制的实现

     

    IOS socket 通信机制的实现

    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 是长连接

    1. - (void)onSocket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newSocket{  
    2.   [_socketArray addObject:newSocket];  
    3.   //等待客户端 发送消息   -1 是永远等待  
    4.    [newSocket readDataWithTimeout:-1 tag:0];  
    5. }  
        4, 等待客户端发送消息, 接受客户端发送消息时触发,
    1. <pre name="code" class="objc">// 监听到客户端发送消息  
    2.   
    3. - (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{  
    4.     // 继续监听 客户端 发来的消息, 形成循环监听  
    5.     [sock readDataWithTimeout:-1 tag:0];  
    6.       
    7. }  




    客户端:

    1, 声明

    1. //---客户端  
    2.     _sendSocket = [[AsyncSocket alloc] initWithDelegate:self];  

    2, 连接服务端

    1. //-----客户端  
    2. //连接至服务端  
    3. - (void)conToHost:(id)sender{  
    4.     //如果是连接状态,  先断开连接  
    5.     if (_sendSocket.isConnected) {  
    6.         [_sendSocket disconnect];  
    7.     }  
    8.       
    9.     //连接  
    10.     [_sendSocket connectToHost:_ipField.text onPort:5678 withTimeout:30 error:nil];  
    11. }  
    3, 发送消息
    1. [_sendSocket writeData:doc.XMLData withTimeout:30 tag:0];  

    以下两个方法  服务端 和  客户端  都会调用

    1. // 作为服务器的时候,  有人断开连接 ,会调用此方法  
    2. //最为客户端  断开连接服务器的时候 也会调用此方法  
    3. //断开链接的时候,  别人与你断开连接的时候也会调用  
    4. - (void)onSocketDidDisconnect:(AsyncSocket *)sock{  
    5.   
    6.     NSLog(@"断开连接");  
    7. //    [_socketArray removeObject:sock];  
    8. }  

    1. // 作为服务器的时候,  有人连接成功 ,会调用此方法  
    2. //最为客户端  连接成功服务器的时候 也会调用此方法  
    3. // 连接成功,  这个客户端 和服务端 都会调用这个方法,  别人链接我的时候 链接成功的时候, 会调用此方法,   我主动链接别人的服务端的时候, 如果连接成功  会调用两次这个方法  
    4. - (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port{  
    5.   
    6.     NSLog(@"连接成功%@", host);  
    7. }  

    UDP 通信示例:

     因为UDP 发送消息 实现不需要建立连接,  这比TCP 简便多了,  UDP 就一个监听接收消息端口的 函数 即可, 比较简单

    服务端

    1, socket  声明, 并制定委托

    1. //服务端  
    2.     _recvSocket = [[AsyncUdpSocket alloc] initWithDelegate:self];  
           2, 绑定 监听的端口
    1. //绑定一个端口  
    2.     [_recvSocket bindToPort:6789 error:nil];  
    3, 开始监听 接受消息的端口
    1. //开始监听接收消息  
    2.     [_recvSocket receiveWithTimeout:-1 tag:0];  
    4, 监听到消息 调用的函数
    1. //接收到消息,  HOST:发送端的ip  
    2. - (BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag fromHost:(NSString *)host port:(UInt16)port{  
    3. ....  
    4.     //继续监听  接收消息  
    5.     [_recvSocket receiveWithTimeout:-1 tag:0];  
    6.     return YES;  
    7. }  


     

    IOS socket 通信机制的实现

    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 是长连接

    1. - (void)onSocket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newSocket{  
    2.   [_socketArray addObject:newSocket];  
    3.   //等待客户端 发送消息   -1 是永远等待  
    4.    [newSocket readDataWithTimeout:-1 tag:0];  
    5. }  
        4, 等待客户端发送消息, 接受客户端发送消息时触发,
    1. <pre name="code" class="objc">// 监听到客户端发送消息  
    2.   
    3. - (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{  
    4.     // 继续监听 客户端 发来的消息, 形成循环监听  
    5.     [sock readDataWithTimeout:-1 tag:0];  
    6.       
    7. }  




    客户端:

    1, 声明

    1. //---客户端  
    2.     _sendSocket = [[AsyncSocket alloc] initWithDelegate:self];  

    2, 连接服务端

    1. //-----客户端  
    2. //连接至服务端  
    3. - (void)conToHost:(id)sender{  
    4.     //如果是连接状态,  先断开连接  
    5.     if (_sendSocket.isConnected) {  
    6.         [_sendSocket disconnect];  
    7.     }  
    8.       
    9.     //连接  
    10.     [_sendSocket connectToHost:_ipField.text onPort:5678 withTimeout:30 error:nil];  
    11. }  
    3, 发送消息
    1. [_sendSocket writeData:doc.XMLData withTimeout:30 tag:0];  

    以下两个方法  服务端 和  客户端  都会调用

    1. // 作为服务器的时候,  有人断开连接 ,会调用此方法  
    2. //最为客户端  断开连接服务器的时候 也会调用此方法  
    3. //断开链接的时候,  别人与你断开连接的时候也会调用  
    4. - (void)onSocketDidDisconnect:(AsyncSocket *)sock{  
    5.   
    6.     NSLog(@"断开连接");  
    7. //    [_socketArray removeObject:sock];  
    8. }  

    1. // 作为服务器的时候,  有人连接成功 ,会调用此方法  
    2. //最为客户端  连接成功服务器的时候 也会调用此方法  
    3. // 连接成功,  这个客户端 和服务端 都会调用这个方法,  别人链接我的时候 链接成功的时候, 会调用此方法,   我主动链接别人的服务端的时候, 如果连接成功  会调用两次这个方法  
    4. - (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port{  
    5.   
    6.     NSLog(@"连接成功%@", host);  
    7. }  

    UDP 通信示例:

     因为UDP 发送消息 实现不需要建立连接,  这比TCP 简便多了,  UDP 就一个监听接收消息端口的 函数 即可, 比较简单

    服务端

    1, socket  声明, 并制定委托

    1. //服务端  
    2.     _recvSocket = [[AsyncUdpSocket alloc] initWithDelegate:self];  
           2, 绑定 监听的端口
    1. //绑定一个端口  
    2.     [_recvSocket bindToPort:6789 error:nil];  
    3, 开始监听 接受消息的端口
    1. //开始监听接收消息  
    2.     [_recvSocket receiveWithTimeout:-1 tag:0];  
    4, 监听到消息 调用的函数
    1. //接收到消息,  HOST:发送端的ip  
    2. - (BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag fromHost:(NSString *)host port:(UInt16)port{  
    3. ....  
    4.     //继续监听  接收消息  
    5.     [_recvSocket receiveWithTimeout:-1 tag:0];  
    6.     return YES;  
    7. }  


    客户端

    1. //发送端  
    2.     _sendSocket = [[AsyncUdpSocket alloc] initWithDelegate:self];  
    3.     [_sendSocket bindToPort:6789 error:nil];  
    2, 发送  ,  里面的参数 需要指定 发送目的ip  端口  超时时间等
    [_sendSocket sendData:doc.XMLData toHost:_ipTextfiled.text port:6789 withTimeout:30 tag:0];

    客户端

    1. //发送端  
    2.     _sendSocket = [[AsyncUdpSocket alloc] initWithDelegate:self];  
    3.     [_sendSocket bindToPort:6789 error:nil];  
    2, 发送  ,  里面的参数 需要指定 发送目的ip  端口  超时时间等
    [_sendSocket sendData:doc.XMLData toHost:_ipTextfiled.text port:6789 withTimeout:30 tag:0];
  • 相关阅读:
    leetcode刷题11. 盛最多水的容器
    docker报错Service 'pwn_deploy_chroot' failed to build: Get https://registry-1.docker.io/v2/library/ubuntu/manifests/16.04:net/http: request canceled
    常用断点记录
    c++继承学习
    leetcode刷题正则表达式
    x64类型的程序逆向思考
    vs2013下配置x64版c++
    MFC学习RepositionBars
    flask权限控制
    leetcode刷题七<整数反转>
  • 原文地址:https://www.cnblogs.com/JZY3160/p/4439376.html
Copyright © 2011-2022 走看看