- 心跳规则,根据心跳断开时间重连
2.消息体设置
//消息体内容 转换成nsdata即可。连接上服务器后,首先需要登录,发送账号密码过去.json格式。
NSData *data = [content dataUsingEncoding:NSUTF8StringEncoding];
NSInteger datalenth =data.length; //获取消息体内容转换成nsdata后的长度
SendDataHead senddata;
senddata.version=0x01; //协议版本号 目前为1
senddata.Mask=0x81; //mask数据。目前固定
//senddata.cmdByte=0x05; //消息cmd命令。。根据消息类型不同而不同。例如登录操的cmd为0x05
senddata.cmdByte=cmd;
//以下是拼接 消息内容的长度 转换成字节放到包头里面 消息体长度占四个字节。是个int数据
senddata.bodyLen[0]=(Byte)((datalenth & 0xFF000000)>>24);
senddata.bodyLen[1]=(Byte)((datalenth & 0x00FF0000)>>16);
senddata.bodyLen[2]=(Byte)((datalenth & 0x0000FF00)>>8);
senddata.bodyLen[3]=(Byte)((datalenth & 0x000000FF));
//将包头内容转换成nsddata
NSData * headdata = [[NSData alloc]initWithBytes:&senddata length:sizeof(SendDataHead)];
[mData appendData:headdata]; //拼放入包头
[mData appendData:data]; //放入消息体
3.socket 传输有阻塞,丢包等现象我们需要进行组包拆包等处理
NSLog(@"data长度====:%ld",self.reciveData.length);
unsigned long currentLength = 0;
if (data.length > 0) {
[self.reciveData appendData:data];
}
NSLog(@"self.reciveData长度====:%ld",self.reciveData.length);
if (self.reciveData.length<7) {
[self listenData];
return;
}
do{
NSData *head = [self.reciveData subdataWithRange:NSMakeRange(currentLength, 7)];//取得包头头部数据 包头目前长度是7位
NSData *lengthData = [head subdataWithRange:NSMakeRange(3, 4)];//取得长度数据 第3-4位是消息体长度 此处和发送包时拼接的头包的格式是一样的
//以下是将包头的长度的四个字节转换成int数字。
NSString* hexString = [lengthData convertDataToHexStr];
NSInteger length = [[hexString hexToDecimal]integerValue];
// NSLog(@"hexString:%@",hexString);
NSLog(@"length:%ld",length);
NSLog(@"self.reciveData当前长度:%ld",self.reciveData.length);
//从第8个字符节开始一直到length长度的数据,都是消息体正文。
if (self.reciveData.length >= (length+7))//如果缓存中数据够一个整包的长度
{
NSData *contentdata=[self.reciveData subdataWithRange:NSMakeRange(currentLength+7, length)];
NSString *msg = [[NSString alloc] initWithData: contentdata encoding:NSUTF8StringEncoding];
NSMutableDictionary * tDataDic =[[NSMutableDictionary alloc] initWithDictionary:[msg jsonValueDecoded]];
[self analysisMessage:tDataDic];
self.reciveData = [NSMutableData dataWithData:[self.reciveData subdataWithRange:NSMakeRange(length+7, self.reciveData.length - length-7)]];
}else{
[self listenData];
return;
}
}while (self.reciveData.length > 7);
4.对于丢包现象我们手到每条消息都要与服务器进行确认,服务器判断是否重发
5.使用wireshark抓包分析包内容是否正确完整
image.png