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

路由器 做网站js模版网站

路由器 做网站,js模版网站,WordPress文章id连号,wordpress模板 商品当时用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/340618/

相关文章:

  • 营销型网站如何建设方案惠州seo外包公司
  • 销售产品网站有哪些网站建设分几个阶段
  • 租个国内服务器做网站多少钱长沙市网站建设公司代理商
  • 网站 设计 方案互联网十大创业项目
  • 网站运营托管咨询晋江 网站建设 推广
  • 网站建设一百万郑州本地seo顾问
  • 网站验收流程网站的域名和ip地址如何重新解析
  • 自己做网站想更换网址做网站建设的平台
  • 石家庄哪有个人建站的泰安市泰山区招聘信息
  • 做网站怎么添加背景图片网站建设整改落实情况
  • 网站推广该怎么做某网站开发项目成本估计
  • 广东建设工程中标公示网站广东省路桥建设有限公司网站
  • 黑龙江省建设银行官网站首页红色网站呢
  • 河北企业网站建设公司手工活接单正规平台
  • 哈尔滨网站建设贴吧重庆建站公司官网
  • 自助创建网站ss网站代码
  • 宣传网站制作哪家质量好西部数据网站管理助手v3.0
  • wordpress 4.0 多站点全球军事网站
  • 网站文章多久收录做网站的为什么那么多骗子
  • 门户网站建设企业友链交换
  • 中山模板建站代理gudao网站建设
  • Wordpress 建站 软件福田附近做网站公司
  • 网站策划书编写高端网页设计培训学校
  • 网站常用英文网站维护中是什么意思
  • 网站主页用ps做简单的网站设计
  • 一般做门户网站多少钱淘宝详情页免费模板
  • 个人网站怎么做支付西安网站建设 至诚
  • 苏州建网站电子商务网站建设与运维论文
  • 网站多国语言设计2022年房地产行业分析报告
  • 做网站要几个人 要多少钱用了wordpress的网站