关于使用Socket传输大量数据的问题(100分)

  • 主题发起人 主题发起人 hezhilong
  • 开始时间 开始时间
H

hezhilong

Unregistered / Unconfirmed
GUEST, unregistred user!
我在开发一个数据采样程序的时候,使用Socket通讯遇到了这样一个问题:我所有
的数据保存在一个一维数组DataArray[0..18431] of single中,我如何一次传送该数组
到另外的一台计算机上呢?我采用的是TServerSocket控件传输,请大侠们指点一二。
另外,接受的计算机采用TClientSocket控件,接收又如何进行呢?
 
发送:sendbuf(DataArray,18432)
接收:在onread事件
recbytes:= socket.ReceiveBuf(recbuffer,MaxRecBuffer);
 
Socket.SendStream(内存变量)与Socket.SendStream(文本变量)都可。
 
但是我试过,用sendbuf(DataArray,18432)发送的时候,接受到的数据后面的全部都
是错的,不知道是为什么,我估计是数组太大的缘故。我但是实验的时候,传输几千个大
小的数组数据就会出错的,实在有些奇怪。
 
用流来解决吧,先把数组写到流中
st:=TMemoryStream.Create;
st.WriteBuffer(DataArray,18431);
再用serversocket控件的socket.sendstream功能把流发出去,
客户端用clientsocket控件socket.receiveBuf接受
 
正常情况下,例如用局域网的时候,你可以在服务器端一次发送全部的数据,在接受的时候
做一个缓存记录,因为发送的时候会自动分包发送,也就是你接收的数据可能是1K又1K的来,
你判断多次接收数据之和,全部接收完你才处理数据,这是最简单的情况,但没能进行异常处理,
为处理异常,你可以自己定义特殊标志的包头,有这标志就认为是包开始,之后才接收真实数据
 
哪位高手能不能写一个源程序测试一下,我刚刚试了的,好像不行的。
麻烦把源程序也贴出来看看
 
最好还是建立头尾标志,一段一段的发送和接受(8192),这是比较安全的做法
 
应该是sendbuf(DataArray,18432*SizeOf(Single))吧
既然你已经知道TServerSocket发送了18432*SizeOf(Single)这么多数据
那你就一直接收,直到接了这么多为止
这是最简单的办法,但不太好;应该采用imstev的办法
 
多人接受答案了。
 
后退
顶部