美文网首页iOS开发精进iOS开发-socket我的阅读
iOS Socket编程(四) Socket具体使用

iOS Socket编程(四) Socket具体使用

作者: 奔跑吧小蚂蚁 | 来源:发表于2018-07-03 15:56 被阅读109次

    iOS Socket编程(一)基本概念
    iOS Socket编程(二)TCP三次握手,四次挥手
    iOS Socket编程(三)Socket与HTTP的区别
    iOS Socket编程(四) Socket具体使用

    Socket的库函数

    在我们的Socket里到底有啥函数可以用呢? 我们一起来看看:
    创建Socket的函数

    // socket()函数用于根据指定的地址族、数据类型和协议来分配一个套接口的描述字及其所用的资源。如果协议protocol未指定(等于0), 则使用缺省的连接方式。
    socket(af,type,protocol)
    
    // 将一本地地址与一套接口捆绑。本函数适用于未连接的数据报或流类套接口,在connect()或listen()调用前使用。当用socket()创建套接口后,它便存在于一个名字空间(地址族)中,但并未赋名。bind()函数通过给一个未命名套接口分配一个本地名字来为套接口建立本地捆绑(主机地址/端口号).
    bind(sockid, local addr, addrlen)
    
    // 创建一个套接口并监听申请的连接.
    listen( Sockid ,quenlen)
    
    // 用于建立与指定socket的连接.
    connect(sockid, destaddr, addrlen)
    
    // 在一个套接口接受一个连接.
    accept(Sockid,Clientaddr, paddrlen)
    
    // 用于向一个已经连接的socket发送数据,如果无错误,返回值为所发送数据的总数,否则返回SOCKET_ERROR。
    send(sockid, buff, bufflen) 
    
    // 用于已连接的数据报或流式套接口进行数据的接收。
    recv()
    
    // 指向一指定目的地发送数据,sendto()适用于发送未建立连接的UDP数据包 (参数为SOCK_DGRAM)
    sendto(sockid,buff,…,addrlen) 
    
    // 用于从(已连接)套接口上接收数据,并捕获数据发送源的地址。
    recvfrom()
    
    // 关闭Socket连接
    close(socked)
    
    
    

    更详细的解释在常用socket函数详解里, 大家有需要可以去看看

    iOS中的Socket连接

    在iOS中, 我们有好几种实现方式, 第一个就是使用苹果爸爸提供的数据刘方式, 也就是NSStream来发送和接收数据, 还可以设置数据流的代理, 对数据流的变化做出相对应的操作, 比如建立连接, 接收到数据, 关闭连接等等.

    这里解释一下:

    • NSStream:NSStream继承自CFStream, 是数据流的父类,用于定义抽象特性,例如:打开、关闭代理,
    • NSInputStream:NSStream的子类,用于读取输入
    • NSOutputStream:NSStream的子类,用于写输出。

    这里我来说说一个第三方的开源库CocoaAsyncSocket, 就不打算用原生去写了, 有兴趣的可以到苹果爸爸的Simple Code里面去找找, 或者去谷歌, 百度里搜搜一些代码.

    这里要说一下, CocoaAsyncSocket是支持TCPUDP两种传输协议的, 所以不用再自己去写一套.

    - (IBAction)connectToServer:(id)sender {
    
        // 1.与服务器通过三次握手建立连接
        NSString *host = @"192.168.1.58";
        int port = 1212;
    
        //创建一个socket对象
        _socket = [[GCDAsyncSocket alloc] initWithDelegate:self 
                                             delegateQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)];
    
        NSError *error = nil;
    
        // 开始连接
        [_socket connectToHost:host 
                        onPort:port 
                         error:&error];
    
        if (error) {
            NSLog(@"%@",error);
        }
    }
    
    
    #pragma mark - Socket代理方法
    // 连接成功
    - (void)socket:(GCDAsyncSocket *)sock 
    didConnectToHost:(NSString *)host 
             port:(uint16_t)port {
             
        NSLog(@"%s",__func__);
    }
    
    
    // 断开连接
    - (void)socketDidDisconnect:(GCDAsyncSocket *)sock 
                     withError:(NSError *)err {
        if (err) {
            NSLog(@"连接失败");
        } else {
            NSLog(@"正常断开");
        }
    }
    
    
    // 发送数据
    - (void)socket:(GCDAsyncSocket *)sock 
    didWriteDataWithTag:(long)tag {
    
        NSLog(@"%s",__func__);
    
        //发送完数据手动读取,-1不设置超时
        [sock readDataWithTimeout:-1 
                              tag:tag];
    }
    
    // 读取数据
    -(void)socket:(GCDAsyncSocket *)sock 
      didReadData:(NSData *)data 
          withTag:(long)tag {
          
        NSString *receiverStr = [[NSString alloc] initWithData:data 
                                                      encoding:NSUTF8StringEncoding];
                                                      
        NSLog(@"%s %@",__func__,receiverStr);
    }
    
    
    

    基本上就酱紫就没啦, 如果觉得还不够, 那我们这里再来补充一个工程.

    相关文章

      网友评论

      • Ade勿忘初心:有demo吗
      • f7139db11dcd:AFNetworking 也是用读取方式进行请求的。RunLoop的时候,我曾经搜索过那个库,无意中发现的,大神可以去研究一下。
        奔跑吧小蚂蚁:@HZW_sis 什么大神啊,也是借鉴别人的,这个库其实早都更新了,我只是用来记忆一下以后用到时候知道这块的东西用起来方便

      本文标题:iOS Socket编程(四) Socket具体使用

      本文链接:https://www.haomeiwen.com/subject/tafjuftx.html