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

项目中用到了Socket技术,以此记录一下。 这个项目用到了byte数组传输,然后接收的时候需要用byte字节接收

新创项目--原生方法
在需要的操作的界面中导入 #import #import #import

定义全局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地址和端口 //第三个参数 结构体的长度sizeofstruct 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 = https://www.it610.com/article/[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; }

【iOS-Socket(原生)-下篇为CocoaAsyncSocket】//使用方法
在需要的调用Socket的地方使用该方法即可 { //填写要连接的Socket端口,这里在本地终端开了12345端口时使用的,如果要发送给设备,把端口号修改成19999即可; //终端开启端口指令 nc -lk -xxxxxxxx为你想开辟的端口号.启动终端输入即可。当启动程序,发送指令后设备就会接收到相对应的消息。 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); }

    推荐阅读