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);
}
推荐阅读
- NeuVector 会是下一个爆款云原生安全神器吗()
- 原生家庭之痛与超越
- 自我探索之原生家庭1
- 云原生微服务技术趋势解读
- 韵达基于云原生的业务中台建设 | 实战派
- 《原生家庭》-|《原生家庭》- 自私型的有毒父母
- MVC原生实现
- 云原生编程挑战赛落幕,阿里云推出云原生领域首本《应用多活技术白皮书》
- 生命致简|还原生命的本质及认知生命的极限
- linux|2022年云原生趋势