服务器数据推送功能实现
来源:互联网 发布:网络古典电台哪个好 编辑:程序博客网 时间:2024/05/21 09:07
最近在做一个功能,就是将服务器中解析到的数据推送的客户端的界面中。
服务端实现流程:
1新建一块结构、结构包括数据总长度及数据指;
2New固定内存A;结构的指针指向A
3在内存区域前25个字节中做为此次推送数据的数据标识域;
4将需要推送的数据放到数据标识域后;
5将数据标识域的标识内容填写完成;
6将结构放入一个先进先出的队列;
7用一个固定线程将数据推送到客户端;
8队列中首个元素出队。
9删除新建内存。
客户端实现流程:
1将接收完的数据放入公共数组;
2新建一块结构,将数组内容复制到结构中的。
3放入数据处理队列。
4线程解析数据;
5根据标识解析不同数据的推送数据;
小心得:
第一次开发时每处理一个界面元素就发送消息到相应窗口,由于处理元素特别多。后来再进行优化。
1;不打开的界面不推送;
2;将所一个界面的要刷新的操作放入到个Vetor中;
3;所有数据处理完成后统一发送消息;各界面接受消息后一次处理完成所有要刷新的内容就可以了。
void __fastcall Senddata(std::vector<EP_BUFFER> UseisEP_BUFFER){ SendBuffer temp; temp.Data=new BYTE[169000]; int isize = sizeof(EP_BUFFER)*UseisEP_BUFFER.size(); temp.Data[0]=0x47; temp.Data[1]=0x44; temp.Data[2]=0x54; temp.Data[3]=0x58; temp.Data[4]=0x50; temp.Data[5]=0x4c; temp.Data[6]=0x55; temp.Data[7]=0x53; temp.Data[8]=0x00;//长度 temp.Data[9]=0x00; temp.Data[10]=0x00; temp.Data[11]=0x00; temp.Data[12]=0x01;//类型 电参数 temp.Data[13]=0x01;//结构长度 temp.Data[14]=0x01;//结构长度 temp.Data[15]=0x00;//结构个数 temp.Data[16]=0x00;//结构个数 temp.Data[17]=0x00;//bak; temp.Data[18]=0x00;//bak; temp.Data[19]=0x00;//bak; temp.Data[20]=0x00;//bak; temp.Data[21]=0x00;//bak; temp.Data[22]=0x00;//bak; temp.Data[23]=0x00;//bak; temp.Data[24]=0x00;//bak; unsigned int * lenint=(unsigned int *)&(temp.Data[8]); *lenint=isize+13; unsigned short * sizeep=(unsigned short *)&(temp.Data[13]); *sizeep=168; unsigned short * sizecount=(unsigned short *)&(temp.Data[15]); *sizecount=UseisEP_BUFFER.size(); memcpy(&(temp.Data[25]), &UseisEP_BUFFER[0], isize); int sendcount=isize+25 ; temp.SendCount=sendcount; EnQueue(pq,temp);//放入队列 if (threadsavedata->Suspended) { threadsavedata->Resume(); }}线程发送部分:
//---------------------------------------------------------------------------__fastcall Thread_dataPro::Thread_dataPro(std::vector<SendBuffer> TempSendBuffer,bool CreateSuspended) : TThread(CreateSuspended){ Priority=tpNormal; FreeOnTerminate=true; ReturnValue=0; UseSendBuffer=TempSendBuffer;}//---------------------------------------------------------------------------void __fastcall Thread_dataPro::Execute(){ vector<SendBuffer>::iterator it; UseSendBuffer.clear(); while (1) { try { while (!IsEmpty(pq)) { SendBuffer temp ; DeQueue(pq,&temp);//清除头数据 for (int i=0;i<MainForm->srvrsckt1->Socket->ActiveConnections;i++) { MainForm->srvrsckt1->Socket->Connections[i]->SendBuf(temp.Data,temp.SendCount); } delete []temp.Data;//清空内存 } Suspended=true; } catch(...) { Suspended=true; } }}客户端接收解析,刷新至界面
void __fastcall TfrmCommRecord::clntscktClSockeerverpushReadinuse(TObject *Sender, TCustomWinSocket *Socket){ int lense=Socket->ReceiveLength(); Byte tempdata[81920]; if (lense<26&&alldataover ) { return ; } else { Socket->ReceiveBuf(tempdata,lense); } if (alldataover) { if (tempdata[0]==0x47&&tempdata[1]==0x44&&tempdata[2]==0x54&&tempdata[3]==0x58&&tempdata[4]==0x50&&tempdata[5]==0x4c&&tempdata[6]==0x55&&tempdata[7]==0x53&&tempdata[12]==1) { recepdata=true; alldataover=false; unsigned int * lenint=(unsigned int *)&tempdata[8]; getdataallcount=*lenint; unsigned short * sizeep=(unsigned short *)&tempdata[13]; datasinglelen= *sizeep; unsigned short * sizecount=(unsigned short *)&tempdata[15]; datasize=*sizecount; // memcpy(&Data[0], &tempdata[0], lense); // Ongetlocation=Ongetlocation+lense ; } } if (recepdata) { memcpy(&Data[Ongetlocation], &tempdata[0], lense); Ongetlocation=Ongetlocation+lense ; if (Ongetlocation==getdataallcount+12) { alldataover=true; recepdata=false; SendBuffer temp; temp.Data=new BYTE[169000]; memcpy(&(temp.Data[0]), &Data[0], getdataallcount+12); temp.SendCount=getdataallcount+12; // UseisSendBuffer.push_back(temp); EnQueue(pq,temp); // temp.threadIndex=i; if (threadsavedata->Suspended) { //threadsavedata->UseSendBuffer=UseisSendBuffer; threadsavedata->Resume(); // UseisSendBuffer.clear(); } else { reCommRecord->Lines->Add("忙"); } getdataallcount=0;; datasize=0;; datasinglelen=0;; Ongetlocation=0;; } if (Ongetlocation>getdataallcount+12) { alldataover=true; recepdata=false; getdataallcount=0;; datasize=0;; datasinglelen=0;; Ongetlocation=0;; } } else { alldataover=true; recepdata=false; //Memo1->Lines->Add("异常数据!"); getdataallcount=0;; datasize=0;; datasinglelen=0;; Ongetlocation=0;; }}//---------------------------------------------------------------------------__fastcall Thread_dataPro::Thread_dataPro(std::vector<SendBuffer> TempSendBuffer,bool CreateSuspended) : TThread(CreateSuspended){ Priority=tpNormal; FreeOnTerminate=true; ReturnValue=0; UseSendBuffer=TempSendBuffer;}//---------------------------------------------------------------------------void __fastcall Thread_dataPro::Execute(){ vector<SendBuffer>::iterator it; // vector<Sqlcharstruct >::iterator it_SingleSqlStr; // MaxNumTime=Now(); // MaxProsTime=Now(); UseSendBuffer.clear(); while (1) { try { while (!IsEmpty(pq)) { SendBuffer temp ; DeQueue(pq,&temp); int getdataallcount=0; int datasinglelen= 0; int datasize=0; if (temp.Data[0]==0x47&&temp.Data[1]==0x44&&temp.Data[2]==0x54&&temp.Data[3]==0x58&&temp.Data[4]==0x50&&temp.Data[5]==0x4c&&temp.Data[6]==0x55&&temp.Data[7]==0x53) { unsigned int * lenint=(unsigned int *)&temp.Data[8]; getdataallcount=*lenint; unsigned short * sizeep=(unsigned short *)&temp.Data[13]; datasinglelen= *sizeep; unsigned short * sizecount=(unsigned short *)&temp.Data[15]; datasize=*sizecount; int stat=25; if (temp.Data[12]==1) { RECEIVE_BUFFER tempbuffer; EP_BufferUse.clear(); for (int i=0;i<datasize;i++) { memcpy(&tempbuffer, &Data[stat], datasinglelen); vector<RECEIVE_BUFFER>::iterator it; for(it = vRecBuffer.begin(); it != vRecBuffer.end(); ++it) { if (it->FZAddr==tempbuffer.FZAddr&&it->NodeAddr==tempbuffer.NodeAddr) { //memcpy(it, &Data[stat], datasinglelen); (*it)=tempbuffer; int cc=34543; break ; } } EP_BufferUse.push_back(tempbuffer); stat+=datasinglelen; } TDateTime start=Now(); SetEptoForm();//刷新至界面/ TDateTime End=Now(); int timeuse=MilliSecondSpan(End,start); } else if (temp.Data[12]==2) { SYSTEMTIME systime; memcpy(&systime, &Data[stat], datasinglelen); SetSystemTime(&systime); } else if (temp.Data[12]==3) { RECEIVE_FZ_BUFFER tempbuffer; vRec_FzCommBufferUseInPlus.clear(); for (int i=0;i<datasize;i++) { memcpy(&tempbuffer, &Data[stat], datasinglelen); vector<RECEIVE_FZ_BUFFER>::iterator it; for(it = vRec_FzCommBuffer.begin(); it != vRec_FzCommBuffer.end(); ++it) { if (it->Fzaddr==tempbuffer.Fzaddr) { (*it)=tempbuffer; int cc=34543; break ; } } vRec_FzCommBufferUseInPlus.push_back(tempbuffer); stat+=datasinglelen; } TDateTime start=Now(); SetFzEptoForm(); TDateTime End=Now(); int timeuse=MilliSecondSpan(End,start); } } delete []temp.Data; } Suspended=true; } catch(...) { Suspended=true; } }}
PS:最近两天刚安装一个Macbook air 的机器;又安装的Windows7的双系统。对苹果产品的各项感受又增加了一点点。虽然昨天到21点多才回家。
上面代码中队列部分是在CSDN上借鉴别人的代码,感谢好人一生平安。。
0 0
- 服务器数据推送功能实现
- C#实现服务器数据实时推送的功能的原理
- nodejs+socket.io实现数据推送功能
- 服务器推送数据 和 客户端定时访问服务器的实现
- 用mqtt实现安卓手机软件的服务器推送功能
- android通过xmpp实现服务器到客户端的推送功能
- EasyDarwin流媒体服务器实现关键帧推送功能
- DWR服务器推技术(实现消息实时推送功能)
- 小米海量数据推送服务技术的功能实现讲解
- Android 实现推送功能
- Android 实现推送功能
- 功能实现-推送消息
- pushlet实现服务器推送
- 在CentOS7 上安装mosquitto1.4.1服务器,实现MQTT信息推送功能并增加websocket功能
- 在CentOS7 上安装mosquitto1.4.1服务器,实现MQTT信息推送功能并增加websocket功能
- 在CentOS7 上安装mosquitto1.4.1服务器,实现MQTT信息推送功能并增加websocket功能
- 使用Jpush(极光推送)实现推送功能
- 服务器推送数据之Comet
- 泛型委托学习(Func和Action)
- 如何安装windows service
- pLsql 学习笔记(-)
- c++STL通用容器 之 集合
- 优秀程序员必备的15大技能
- 服务器数据推送功能实现
- 斐波那契博弈
- mv命令
- Cocos2d-x 3.0 开发(四)使用CocoStudio创建UI并载入到程序中
- IOS之常用宏
- [LeetCode]N-Queens II
- Maven安装过程(maven环境变量的配置)
- WPF与WCF wwf
- [嵌入式新产品] 蓝牙遥控器