关于clientsocket的接收数据解析问题!快来看~~~~(50分)

  • 主题发起人 主题发起人 ranyang
  • 开始时间 开始时间
R

ranyang

Unregistered / Unconfirmed
GUEST, unregistred user!
本人在客户端有一个Tclientsocket控件,专门接收Tserversocket发出的信息,采用的是发出Xml格式的文档,形如:
<?xml version=&quot;1.0&quot; encoding=&quot;GBK&quot;?>
<RES>
<TYPE>2</TYPE>
...
</RES>
当接收后,clientsocket解析,在理想情况下:
用下方法解:
DWStr:=Socket.ReceiveText;
XMLRead.Active := False;
XMLRead.XML.Text := DWstr;
XMLRead.Active := True;
Root:= XMLRead.DocumentElement;
if Root.ChildNodes['TYPE'].Text='2' then
。。。。
在理想情况下,来一条就解析一条,基本没有问题!但是现在发生一个问题:
来的数据往往不是完整的一条或有很多条:
<?xml version=&quot;1.0&quot; encoding=&quot;GBK&quot;?>
<RES><TYPE>2</TYPE><TERMINAL_ID>A57018</TERMINAL_ID><TERMINAL_TYPE>TDW</TERMINAL_TYPE><UIM_ID>A57018</UIM_ID><GSN></GSN><START_TIME></START_TIME><RETURN_TIME>2006-06-29 10:41:45</RETURN_TIME><LATITUDE>30.556153</LATITUDE><LONGITUDE>114.277576</LONGITUDE><VELOCITY>33.336</VELOCITY><ALTITUDE>50</ALTITUDE><RADIUS>0</RADIUS><DIRECTION>29</DIRECTION></RES>
<?xml version=&quot;1.0&quot; encoding=&quot;GBK&quot;?>
<RES><TYPE>2</TYPE><TERMINAL_ID>FB0287</TERMINAL_ID><TERMINAL_TYPE>TDW</TERMINAL_TYPE><UIM_ID>FB0287</UIM_ID><GSN></GSN><START_TIME></START_TIME><RETURN_TIME>2006-06-29 10:41:45</RETURN_TIME><LATITUDE>32.258915</LATITUDE><LONGITUDE>111.455278</LONGITUDE><VELOCITY>24.076</VELOCITY><ALTITUDE>50</ALTITUDE><RADIUS>0</RADIUS><DIRECTION>29</DIRECTION></RES>

或:
<?xml version=&quot;1.0&quot; encoding=&quot;GBK&quot;?>
<RES><TYPE>2</TYPE><TERMINAL_ID>A57018</TERMINAL_ID><TERMINAL_TYPE>TDW</TERMINAL_TYPE><UIM_ID>A57018</UIM_ID><GSN></GSN><START_TIME></START_TIME><RETURN_TIME>2006-06-29 10:41:45</RETURN_TIME><LATITUDE>30.556153</LATITUDE><LONGITUDE>114.277576</LONGITUDE><VELOCITY>33.336
等一下才会有下半段:
</VELOCITY><ALTITUDE>50</ALTITUDE><RADIUS>0</RADIUS><DIRECTION>29</DIRECTION></RES>
等等情况。所以造成解析错误抱错!
有什么好的办法吗?!要求数据量大,而且相应时间要快!因为每秒钟都有大量数据发回来!!!
大家都想想呀!!!!
 
加个帧头就可以了,接收后先找帧头
 
这个东西是干什么用?我做过一个,把数据直接保存成XML文件,作为文件发送,收到后保存,然后再开个线程进行处理。在文件传送时,保证传输的可靠性。不知道你的程序是不是需要实时响应。
 
我不会用线程处理!怎么开线程亚!我打算收到后先放在一个文件的文本放在listbox的一个item里,然后一个一个处理,怎么开线程?!望楼上老大帮忙。。。。我也想做实时相应!但是数据量大!可能会比较难。。。
 
加一个数据包头,接收后拆包

例如: “包头,长度”
 
你得把整条XML文档接收完成才能解析,所以得判断一下有没有收完,收完了才能closesocket。
 
我的是长连接,必须保持连接,每分钟会有大约250条数据(
形如:
<?xml version=&quot;1.0&quot; encoding=&quot;GBK&quot;?>
<RES><TYPE>2</TYPE><TERMINAL_ID>A57018</TERMINAL_ID><TERMINAL_TYPE>TDW</TERMINAL_TYPE><UIM_ID>A57018</UIM_ID><GSN></GSN><START_TIME></START_TIME><RETURN_TIME>2006-06-29 10:41:45</RETURN_TIME><LATITUDE>30.556153</LATITUDE><LONGITUDE>114.277576</LONGITUDE><VELOCITY>33.336</VELOCITY><ALTITUDE>50</ALTITUDE><RADIUS>0</RADIUS><DIRECTION>29</DIRECTION></RES>

),并且必须实时解析!
大家有没有更好的办法?!
 
采用一个缓从区
 
有没有具体一点的说法呢
 
看来楼主不知道TCP协议是一种流协议。流协议有一个特性就是数据包分片。
建议楼主去看看网络数据就知道了!其实解决很容易的!
 
多人接受答案了。
 
后退
顶部