问题描述
我只有1个客户端和我长期连接,客户端不断向服务器端发送告警信息。每一条告警数据长度不固定,以START开始,以ENDSTART结束。我是服务器端,采用LISTEN,一旦收到数据,就从缓冲区取数据,现问题如下:如何每次从缓冲区取出一条完整数据(以START开始,以ENDSTART结束。)我现在的程序每次取1024个字节,大部分告警数据都完整,但少部分数据数据不完整(例如,某次取的数据包括本次数据和下次数据的一部分),而且数据一旦不完整,就会延续几次,然后又完整了,怎么解决呢?另外,数据要进行解析,分析,呈现,入库等操作,正操作期间,客户端又发来数据,怎么办呢?多线程吗?如何做?有没有类似程序可以参考
解决方案
解决方案二:
一般来说,想开一个大小合适的buffer,就要根据传过来的数据的长度来定义.可是socket没有提供将有多少数据会收到.因此,我们可以定义一个自定义包头,如包的定义///<summary>///BYTEDESCRIPTION///0包类型///1-4包长度///5-N聊天内容,XML封装///</summary>publicclassChatPacket:PacketBase{publicChatPacket(byte[]p,intsize){packet=p;packetSize=size;}publicChatPacket(stringfrom,stringto,stringtext,stringfromnickname){stringcontent="<From>"+from+"</From><To>"+to+"</To><FromNickName>"+fromnickname+"</FromNickName><Content><![CDATA["+text+"]]></Content>";byte[]chatbytes=NetHelper.Compress(content);//处理缓冲区packetSize=heaersize+chatbytes.Length;packet=newbyte[packetSize];SetHeader(packet,PacketTypes.PT_Chat);//NetHelper.AppEncoding.GetBytes(content,0,content.Length,packet,heaersize);Buffer.BlockCopy(chatbytes,0,packet,heaersize,chatbytes.Length);}publicstringTo{get{returnNetHelper.ParseConent(Content,"//To");}}publicstringFromNickName{get{returnNetHelper.ParseConent(Content,"//FromNickName");}}publicstringChatText{get{returnNetHelper.ParseConent(Content,"//Content");}}publicoverridestringContent{get{if(_content==null){byte[]chatbytes=newbyte[ContentLength];Buffer.BlockCopy(packet,heaersize,chatbytes,0,ContentLength);_content=NetHelper.Decompress(chatbytes);}return_content;}}}如此一来的话,当我们发觉有数据包来时,我们可以分二次来收取,第一次,只收前5个字节,其中第一个字节表示包的类型,如聊天,文件请求,登录等,而1-4位,则表示后面真正的数据的长度,我用4个字节32位来表示,int型就是4字节.这样我就可以知道开多少合适的缓冲区了.下面的操作就比较简单了.
解决方案三:
请联系我。QQ:250623008
解决方案四:
正如一楼回复,对于大数据包的发送与接收,当欲发送的数据包大于定义的大小时,将其按定义的大小拆分,然后指定数据包的序号(数据包对象自定义),然后发送,在接收端接收到数据时,检测其是否是被拆分发送的数据包,如果是,则将其加入到缓存列表中,然后定义检查该列表再合成数据包.