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

2018-12-12  本文已影响0人  sennnnn
项目中用到了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);
}
上一篇下一篇

猜你喜欢

热点阅读