项目中用到了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);
}