服务器数据推送功能实现

来源:互联网 发布:网络古典电台哪个好 编辑:程序博客网 时间: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
原创粉丝点击