美文网首页
iOS-Socket(原生)-下篇为CocoaAsyncSock

iOS-Socket(原生)-下篇为CocoaAsyncSock

作者: sennnnn | 来源:发表于2018-12-12 16:20 被阅读0次
    项目中用到了Socket技术,以此记录一下。
    这个项目用到了byte数组传输,然后接收的时候需要用byte字节接收
    

    新创项目--原生方法

    在需要的操作的界面中导入
    #import <sys/socket.h>
    #import <netinet/in.h>
    #import <arpa/inet.h>
    
    定义全局clinentSocket
    @property (assign, nonatomic)int clientSocket;//这个用于创建Socket连接。用于开关连接关闭Socket
    
    //封装连接Socket
    - (BOOL)ConnectionIP:(NSString*)ip andWithPort:(int)port{
        //返回值 如果创建成功的是socket的描述符
        int clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        self.clientSocket = clientSocket;
        //连接服务器
        //第一个参数 socket的描述符
        //第二个参数 结构体ip地址和端口
        //第三个参数 结构体的长度sizeof
        
        struct sockaddr_in addr;
        addr.sin_family = AF_INET;
        addr.sin_addr.s_addr = inet_addr(ip.UTF8String);
        addr.sin_port = htons(port);
        int result = connect(clientSocket, (const struct sockaddr *)&addr, sizeof(addr));
        
        if(result == 0 ){
            NSLog(@"成功");
            return YES;
        }else{
            NSLog(@"失败");
            return NO;
        }
    }
    
    //这里演示的是原生byte数组传输过程,并非字符串,若用字符串则用注释中替代send方法即可。
    - (NSString*)sendMsgText:(NSString*)sendText{
        //3向服务器发送数据
        
        const char *msg = sendText.UTF8String;
        //strlen(msg);这个参数send(self.clientSocket, msg, strlen(msg), 0);
        //传输指令
        Byte textByte[] = {0x21,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00};
        ssize_t sendCount = send(self.clientSocket, textByte, sizeof(textByte), 0);
        NSLog(@"发送的字节数 %zd",sendCount);
        
        //4 接受服务器返回的数据
        //返回的是实际接受的字节个数
        uint8_t buffer[1024];
        ssize_t recvCount = recv(self.clientSocket, buffer, sizeof(buffer), 0);
        NSMutableData* mData = [NSMutableData data];
        [mData appendBytes:buffer length:recvCount];
        // 当返回的数据可能大于1024的时候可用这个.
        //    while (recvCount != 0) {
        //        recvCount = recv(self.clientSocket, buffer, sizeof(buffer), 0);
        //        NSLog(@"接收的字节数 %zd",recvCount);
        //        [mData appendBytes:buffer length:recvCount];
        //    }
        NSData* data = [NSData dataWithBytes:buffer length:recvCount];
    //    NSString* recvMsg = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
    //把数据传输到该封装方法中
        NSString* recvMsg = [self HexStringWithData:data];
        
        NSLog(@"收到 %@",recvMsg);
        return recvMsg;
    }
    
    //data转为十六进制字符串
    -(NSString *)HexStringWithData:(NSData *)data{
        Byte *bytes = (Byte *)[data bytes];
        NSString *hexStr=@"";
        for(int i=0;i<[data length];i++) {
            NSString *newHexStr = [NSString stringWithFormat:@"%x",bytes[i]&0xff];///16进制数
            if([newHexStr length]==1){
                hexStr = [NSString stringWithFormat:@"%@0%@",hexStr,newHexStr];
            }
            else{
                hexStr = [NSString stringWithFormat:@"%@%@",hexStr,newHexStr];
            }
        }
        hexStr = [hexStr uppercaseString];
        return hexStr;
    }
    

    //使用方法

    在需要的调用Socket的地方使用该方法即可
    {
        //填写要连接的Socket端口,这里在本地终端开了12345端口时使用的,如果要发送给设备,把端口号修改成19999即可;
    //终端开启端口指令 nc -lk -xxxx     xxxx为你想开辟的端口号.启动终端输入即可。当启动程序,发送指令后设备就会接收到相对应的消息。
        BOOL result = [self ConnectionIP:@"127.0.0.1" andWithPort:12345];
        if (!result) {
            NSLog(@"连接失败");
            return ;
        }
        NSLog(@"连接成功");
        
        //这里输入的内容与实际传输无关
        NSString* recv = [self sendMsgText:@"0x21 0x00 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x06 0x00 0x00 0x00 0x06 0x00 0x00 0x00 0x00 0x00"];
        NSLog(@"recv = %@",recv);
        close(self.clientSocket);
    }
    

    相关文章

      网友评论

          本文标题:iOS-Socket(原生)-下篇为CocoaAsyncSock

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