項(xiàng)目中用到了Socket技術(shù),以此記錄一下您访。
這個(gè)項(xiàng)目用到了byte數(shù)組傳輸业筏,然后接收的時(shí)候需要用byte字節(jié)接收
新創(chuàng)項(xiàng)目--原生方法
在需要的操作的界面中導(dǎo)入
#import <sys/socket.h>
#import <netinet/in.h>
#import <arpa/inet.h>
定義全局clinentSocket
@property (assign, nonatomic)int clientSocket;//這個(gè)用于創(chuàng)建Socket連接棕洋。用于開關(guān)連接關(guān)閉Socket
//封裝連接Socket
- (BOOL)ConnectionIP:(NSString*)ip andWithPort:(int)port{
//返回值 如果創(chuàng)建成功的是socket的描述符
int clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
self.clientSocket = clientSocket;
//連接服務(wù)器
//第一個(gè)參數(shù) socket的描述符
//第二個(gè)參數(shù) 結(jié)構(gòu)體ip地址和端口
//第三個(gè)參數(shù) 結(jié)構(gòu)體的長(zhǎng)度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數(shù)組傳輸過程单默,并非字符串膨俐,若用字符串則用注釋中替代send方法即可抵窒。
- (NSString*)sendMsgText:(NSString*)sendText{
//3向服務(wù)器發(fā)送數(shù)據(jù)
const char *msg = sendText.UTF8String;
//strlen(msg);這個(gè)參數(shù)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(@"發(fā)送的字節(jié)數(shù) %zd",sendCount);
//4 接受服務(wù)器返回的數(shù)據(jù)
//返回的是實(shí)際接受的字節(jié)個(gè)數(shù)
uint8_t buffer[1024];
ssize_t recvCount = recv(self.clientSocket, buffer, sizeof(buffer), 0);
NSMutableData* mData = [NSMutableData data];
[mData appendBytes:buffer length:recvCount];
// 當(dāng)返回的數(shù)據(jù)可能大于1024的時(shí)候可用這個(gè).
// while (recvCount != 0) {
// recvCount = recv(self.clientSocket, buffer, sizeof(buffer), 0);
// NSLog(@"接收的字節(jié)數(shù) %zd",recvCount);
// [mData appendBytes:buffer length:recvCount];
// }
NSData* data = [NSData dataWithBytes:buffer length:recvCount];
// NSString* recvMsg = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
//把數(shù)據(jù)傳輸?shù)皆摲庋b方法中
NSString* recvMsg = [self HexStringWithData:data];
NSLog(@"收到 %@",recvMsg);
return recvMsg;
}
//data轉(zhuǎn)為十六進(jìn)制字符串
-(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進(jìn)制數(shù)
if([newHexStr length]==1){
hexStr = [NSString stringWithFormat:@"%@0%@",hexStr,newHexStr];
}
else{
hexStr = [NSString stringWithFormat:@"%@%@",hexStr,newHexStr];
}
}
hexStr = [hexStr uppercaseString];
return hexStr;
}
//使用方法
在需要的調(diào)用Socket的地方使用該方法即可
{
//填寫要連接的Socket端口萨咕,這里在本地終端開了12345端口時(shí)使用的,如果要發(fā)送給設(shè)備冀宴,把端口號(hào)修改成19999即可灭贷;
//終端開啟端口指令 nc -lk -xxxx xxxx為你想開辟的端口號(hào).啟動(dòng)終端輸入即可。當(dāng)啟動(dòng)程序略贮,發(fā)送指令后設(shè)備就會(huì)接收到相對(duì)應(yīng)的消息甚疟。
BOOL result = [self ConnectionIP:@"127.0.0.1" andWithPort:12345];
if (!result) {
NSLog(@"連接失敗");
return ;
}
NSLog(@"連接成功");
//這里輸入的內(nèi)容與實(shí)際傳輸無關(guān)
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);
}