Socket接收数据后数据量很大,缓存之后,如何处理,请高手指点....在线等!马上给分

wolf2005 2003-08-20 02:00:38
Socket接收数据并进行缓存:List:Strings;
procedure TXMlData.OnReadData(Sender: TObject; Socket: TCustomWinSocket); //OnRead事件对应的过程
begin
BeforeResolveData:=TStringList.Create;
BeforeResolveData.Text:=Socket.ReceiveText;//每秒收到800条左右的数据
List.AddObject(IntToStr(Index),BeforeResolveData);
while List.Count>0 do
begin
ProcessData;//些过程用处理 AlarmList中缓存的数据,此过程比较耗时间
end;
end;

ProcessData放在Socket接收中会不影响Socket接收数据?接收大量为防止处理不过来,有没有什么好的方法,请高手指点。我觉得象上面这么做会有问题,比如现在正执行while这时又来了一个新的数据Soket能不能接收?它还会存到List中去吗?
...全文
540 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
lance09 2003-08-20
  • 打赏
  • 举报
回复
用线程吧,其它也真的没有什么好办法.学习中...................
lxpbuaa 2003-08-20
  • 打赏
  • 举报
回复
你这个又不是战争时要拦截导弹的程序,可能要求那么高的及时性么?再说数据一直不停的再接收啊,只不过有些数据延迟处理,及时性已经够强了。

————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————
wolf2005 2003-08-20
  • 打赏
  • 举报
回复
: lxpbuaa
线程方式有个疑问,因为程序实时性要求很高,就是说,从转发服务器接收来的数据必须及时的处理。如果用线程来做怎么会知道什么时间来数据?是不是可以让线程始终在执行,比如:
while 1 > 0 do
begin
Synchronize(ProcessData);
end;
这个样子是可以,但是CPU占用太大, 如果Sleep();一下,就不能做到实时了
lxpbuaa 2003-08-20
  • 打赏
  • 举报
回复
mj_hc(实变函数) 说的是有道理的,采用tcp协议时不必要担心这个问题。
不过在不考虑协议和不能改变服务端传送方式的情况下,可以这样来作:
在客户端将数据接收和处理分开,也就是:
BeforeResolveData.Text:=Socket.ReceiveText;//接收数据

ProcessData;
不要都放在TXMlData.OnReadData中。TXMlData.OnReadData应该只管接收,然后用另外一个线程专门来ProcessData(处理数据)。

————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————
Soft001 2003-08-20
  • 打赏
  • 举报
回复
gz
vargent77 2003-08-20
  • 打赏
  • 举报
回复
如果只是转发,但又担心数据量太大处理不了,那就把还未转发的数据先送到一个Buf存起来,发送时再按发送区的情况(如发送是否完成)按顺序读入。接收应该是最高优先级的线程
mj_hc 2003-08-20
  • 打赏
  • 举报
回复
如果是tcp协议,你的客户端如果没有接收,或者来不及接收,服务器端是不会不停的发的,服务器端会阻塞,等待客户端的接收。
wolf2005 2003-08-20
  • 打赏
  • 举报
回复
starcbh:
你是说当While执行的时候,Socket就不接收数据了,也不往List里存了?那需要用什么方法才可以呢?
wolf2005 2003-08-20
  • 打赏
  • 举报
回复
zsy_good
不是这个问题,即使发1024他字节,也不能解问题,因为发送的频率比较大,而不是数据量大的问题。还有如果按你这么做,实际是做数据缓存放在服务器端,在我这里是不可能的,因为要接收数据的服务器,只是一个数据转发服务器,不对数据进行任何处理。
starcbh 2003-08-20
  • 打赏
  • 举报
回复
当然不会……
zsy_good 2003-08-20
  • 打赏
  • 举报
回复
把数据分多次发送
每次发送1024字节。
客户端收到数据以后,发送一个自己的通讯协议,让服务器再次发送下面的数据
wolf2005 2003-08-20
  • 打赏
  • 举报
回复
: lxpbuaa
现在是只能被动的接收数据,怎么样做才保证不丢失数据呢?有没有好的建议?
lxpbuaa 2003-08-20
  • 打赏
  • 举报
回复
有这种可能,一般客户端和服务端应该采用应答-发送的方式,即发送端应该接收到接收端的“发送下一笔数据”请求后再接着发送数据。

————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————
wolf2005 2003-08-20
  • 打赏
  • 举报
回复
难道没有人做过吗?............................................
wolf2005 2003-08-20
  • 打赏
  • 举报
回复
还有一点忘记了就是在BeforeResolveData:=TStringList.Create;之前有一个Index:=Index+1;

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧