当前位置: 首页 > news >正文

徽州网站建设免费网页制作

徽州网站建设,免费网页制作,汕头好的建站网站,手机域名注册网站当时用TCP协议传输数据时,经常出现粘包的现象 当服务器向客户端发送数据之后,客户端还没有接收数据的时候,这段时间数据在什么地方? 1、服务器?服务器已经发出数据了 2、网线?数据应该在内存,怎…

当时用TCP协议传输数据时,经常出现粘包的现象
当服务器向客户端发送数据之后,客户端还没有接收数据的时候,这段时间数据在什么地方?
1、服务器?服务器已经发出数据了
2、网线?数据应该在内存,怎么会在网线里面,又没有内存
3、客户端?是的,这个时候数据已经到达客户端了,只不过被保存在客户端的缓存中了(内核缓冲区),客户端只有在read的时候才能读出数据
场景:服务器每次给客户端发出一条数据,但是每次发送数据的量是不一样的,这时要求客户端把服务器发过来的数据依次接收到本地并且进行对应的解析,如果客户端一次发出10个字节,那么客户端也一次读出10个字节,如果多读了,那么就把下一条数据读出来了,此时解析数据会是错误的,这就是TCP粘包

处理办法:发送端在每一个数据包前面加上包头,包头中加入数据长度
接收端接收到后的处理:首先包头的大小是固定的,一般就是一个long或者int类型,所以我们根据这个long或者int类型求出一个固定大小,8字节(long)或者4字节(int),所以在读数据包的时候直接根据这个类型先去读8字节或者4字节,这样就可以读出数据包的长度,然后根据这个长度去读后边的这个数据块
比如此次接收到的长度为100,那么就向后读取100个字节的数据,就是此次的一个包,哪怕此时缓冲区有1000个字节数据,只读这100个字节就能获取一个完整的包,剩余的900个字节就需要下一次去处理,下次处理的时候还是先读包头,读出数据包的一个长度,然后根据这个长度去读取相应的数据,这样一次一次读取就可以一点一点把数据拆分出来了

例:这里以Qt编写的基于opencv的人脸识别的服务器和客户端为例,客户端发送拍下的人脸发送到服务器进行识别,要求传输一帧完整的人脸数据,这就有可能粘包,可能同时发送两个人脸向服务器,此时就需要处理粘包
首先客户端发送图片数据

//把Mat数据转化为QbyteArray, --》编码成jpg格式
std::vector<uchar> buf;
cv::imencode(".jpg",srcImage,buf);   //这就是将拍摄的原始的图像转为jpg然后将数据放到buf中
QByteArray byte((const char*)buf.data(),buf.size()); //数据格式转为QByteArray 
//准备发送
quint64 backsize = byte.size();    //获取数据的长度,这里可以看到backsize是quint64型变量,占8个字节
QByteArray sendData;
QDataStream stream(&sendData,QIODevice::WriteOnly);
stream.setVersion(QDataStream::Qt_5_14);
//将数据放入码流,首先放入数据的长度backsize,quint64为8字节的长度,后面就是数据
stream<<backsize<<byte;  
//发送
msocket.write(sendData);  //将数据包发送

服务器接收图片数据

static quint64 bsize = 0;  //全局变量QDataStream stream(msocket); //把套接字绑定到数据流
stream.setVersion(QDataStream::Qt_5_14);if(bsize == 0){//查看目前TCP的内存缓冲区的数据长度是否能达到bsize所占的字节数,这里应该是8字节if( msocket->bytesAvailable() < (qint64)sizeof(bsize) ) return ;//说明数据长度够8个字节,然后就可以获取采集数据的长度stream>>bsize;
}//获取目前缓存中剩余数据的长度,小于刚才获取的8字节的数据长度说明数据还没有发送完成,返回继续等待
if(msocket->bytesAvailable() < bsize)
{return ;  //此时bsize没有清空,下次还会来这里检查获取的数据长度是否大于或等于bsize
}
QByteArray data;
stream>>data;
bsize = 0;   // 将bsize设为0,说明处理完了一包数据 
if(data.size() == 0)//没有读取到数据
{return;
}//显示图片
QPixmap mmp;
mmp.loadFromData(data,"jpg");
mmp = mmp.scaled(ui->picLb->size());
ui->picLb->setPixmap(mmp);
http://www.yayakq.cn/news/356447/

相关文章:

  • 自己网站织梦网站怎样做防护
  • 建设银行网站官方网站网站设计与建设实训
  • 外文网站建设完成seo专家是什么意思
  • 荷兰网站后缀做智能网站软件下载
  • 建网站发信息做推广网页制作详细设计
  • 云主机网站的空间在哪里看网站建设概念
  • 常州网站制作工具建设官网登录
  • 公司网站做么做百度排名如何看网站的版本号
  • 太阳能公司网站建设多少钱百度seo排名优化
  • 做网站盘锦网站维护升级页面
  • 新闻源网站怎么做wordpress 局域网访问不了
  • wordpress 网址 建站朝阳网站建设 国展
  • 网站开发设计公司手机网站设计公司
  • 用源码做自己的网站wordpress功能修改
  • 有什么网站是专做婚礼素材的网站怎么发布做微商
  • 买网站做seo成都市建设领域信用系统网站
  • 成都网站建设熊掌号网站策划需要什么能力
  • 营销型企业网站建设的流程是网站可以称为系统吗
  • 汇款账号 网站建设播放我的观看历史记录
  • FileZilla做网站网站刚做好怎么做优化
  • 学校网站怎么建设给单位做网站需要备案吗
  • 如何做网站对话框黄冈网站官方登录平台
  • 做金融看哪些网站有哪些海报设计怎么做
  • 网站开发的理解某企业网站建设方案
  • 微信系统平台开发百度seo公司有哪些
  • 江苏省建设执业网站wordpress插件库
  • 简约手机网站源码ps为什么做不了视频网站
  • 免费视频素材网站可以打开任何网站的软件
  • 题材挖掘机网站怎么做wordpress 后台文章 查询条件
  • 网站 制作软件wordpress公司网站