在三层结构中,如何使用 SocketConnection 传输大量数据(50分)

  • 主题发起人 主题发起人 放飞
  • 开始时间 开始时间

放飞

Unregistered / Unconfirmed
GUEST, unregistred user!
在三层结构中,客户端一次提交的数据表很大(记录中有 BLOB 字段,存储影音文件,
一条记录就可能大于10M),
使用 SocketConnection ,在一次上传更新 10M 以上的数据时,出现Socket错误。
反复研究发现 SocketConnection 在上传数据时,是一次性全部传出,
当数据很大时也是一次全部的传出,这样导致传送失败。
哪位高手可以帮我解决这个问题?
 
确实数据库的socketconnect连接不太适合传输大数据量的纪录
你的大于10M的纪录建议采用ftp协议,最好能够支持断点续传
 
也想过这种方式,但是封装在业务层的远程 COM 需要在客户端直接调用,因此采用了
SocketConnection,这种大数据的时候虽然不多,但毕竟是有。总不能为了这不多的需求
再开发一套FTP吧?希望高手指点一二
 
将数据压缩一下再传出去
delphi的例程中有一个单元可直接拿来使用
 
已经是压缩过的数据了,不然更大!
 
个人认为,非常大的数据本来就应该通过其它途径传输,并且传到服务器上也不应该放到数据库里,虽然这样开发上是简单了,但运行一段时间后就会使数据库性能大大下降
 
SocketConnection是通过WinSocket API技术实现通讯的,他的传送数据方式和ClientSocket以及ServerSocket的方式一样.你可以去看看SConnect部分的源代码,他里面就是定义ClientSocket和TCustomWinSocket,并且利用Socket.ReceiveBuf、Socket.ReadBuf实现数据的发送和接收。而这个Socket方法在传送大量的数据时是会出错的,所以在普通的ClientSocket,ServerSocket结构的程序中遇到大量数据时也是通过对数据流分段发送和接收来实现的(你可以到DFW的Internet/TCPIP部分去看看),这也就是SocketConnection为什么不能一次传送大量数据的原因。
我想到几个解决办法,仅供参考:
1 利用clientdataset分段获取的方式
2 同HostingLian那样开发ftp协议通信获取
3 看看有没有第3方控件支持
4 我听说利用TWinSocketStream可以通过socket一次传送大量数据,如果可以,那么可以试着修改Sconnect的源代码,把发送和接收数据都通过TWinSocketStream实现。(难度系数极大!)
 
看来是没有其他的好方法了。
 
呵呵,我昨天还去看了一下SConnect部分的源代码(因为公司有个中间件也用Socketconnection进行连接,我想关心一下这个问题),看到这么一句
Socket.ReceiveBuf(sig,sizeof(sig));
然后我去查了查sig的定义,发现他是integer类型的,也就是说接收的缓冲区是integer类型的长度即13381292字节,换算了一下是12M左右,正好和你说的10M多时差不多,你可以看看你的程序在发送11M和13M时有什么结果:)
我刚在又想到一个办法,直接吧sig类型换成array [0..xxx] of char(xxx是你可能遇到的最大数据量),或许可以解决你的问题
 
我已经用其他的方法解决了这个问题,方法是:
将这些 BLOB 字段中的内容保存到不同的文件中,然后再将这些文件压缩成一个文件,
用 Socket 以流的方式将这个文件连同数据表文件(也存成了文件)一起传送了上去。
在接收端再还原、解压缩、提交。虽然绕了个弯,但是通过这个问题我基本上看完了
SConnectd单元以及相关的 Delphi 实现的 MIDAS 功能的代码(这也是这么长时间没回应这个问题的原因)。收获不小。
感谢各位热心的朋友。
 
后退
顶部