数组有没有大小限制(Sockets流) (50分)

  • 主题发起人 主题发起人 ditdot
  • 开始时间 开始时间
D

ditdot

Unregistered / Unconfirmed
GUEST, unregistred user!
因为用到了Sockets流,而且每次从服务器发出的信息量很大,每次都有将近250000byte,
所以在客户端接受时,定义了一个数组变量:
Bufferread:array[0..250000] of byte;
我想问一下:
1.数组本身有没有大小限制。
2.大家在用到Sockets流时,如果信息量很大,大家都是怎样做的?除了象这样定义一个
大数组之外,还有没有其他好办法。
 
有限制,建议用pchar类型,限制大小我忘记了,但是一定是有限制的,我遇到过这个问题,我改用了pchar类型解决的 。
 
分块发送
 
>>爱元元的哥哥
现在就是“分块发送”,按双方协议发过来的每一个“块”大概有4000~5000byte,
你是不是这个意思,服务器“分块发送”,客户端分块接受,这样接受方就避免用大数组了,
应该是我没有说清楚,这里的客户端是这样工作的,
缓冲区初始化——接受——导入本地数据库(SQL Server),因为导入数据库要比接受数据慢,如果每次接受数据后都做导入数据库的操作,这样会不会因为来不及收下一个包,而发生数据丢失(因为缓冲区满了)。
 
有限制!不过不确定是多少了,大概好像可能也许是65535吧!
 
数组有限制,所有维数(下标索引)的乘积是2GB大小,不是指基础数据类型的乘积。
请参考DELPHI联机帮助:"Static arrays"
 
>>鲨鱼
谢谢,我按你说的,查了DELPHI联机帮助,真是这样。
但是对于我的第二问,大家谈的很少。能否给点提示。
 
对于SOCKETS流我可是不太懂,没作过这方面的应用,用引挚搜索一下相关的主题参考其他
的资料吧,如果E文好,网上一大堆。

其实用大数组也好,就是管理上比较麻烦,资源的分配和释放很重要。分块发送只是一处理
技术问题,由于网络传输时间的不确定性,数组大小的确定很多时候靠经验。
 
对于第二个问题
我是这么处理的,是一个TMemoryStream的内存流,然后分块发送
用到的过程以及函数,属性

TMemoryStream
---Position
---CopyFrom
使用了一个中间变量也是TMemoryStream
因为在Twinsocket的SendStream发送的时候,Stream是释放掉的



 
你的socket传输的是什么业务数据?
可以用文件,也可以用队列等等,要看实际情况。
 
>>softdog
我的socket传输的是数据库的记录。
>>gdcqs
水平太凹,看不懂你写的,能否再详细说说。
>>鲨鱼
这两天抽空到网上搜了一下,[:(],没有找到。java的不少......
 
其实 数据不要太大了 太大了没有用的

从底层硬件上来讲
MAC 帧 最大是 1500字节 所以 一个数据包 超过了 1500自己
就是 2帧 在传送上没有 效率的提高

 
>>fz97534
的确如你所说,底层是分包(TCP)发送的,现在我把自己的问题重复一下,
如果发送的信息量很大,每次都有将近250000byte,按你说的
“其实 数据不要太大了 太大了没有用的”,意思是不是说接收端的缓冲区,不用太大,
太大了没用?如果这么做了,会不会丢包
(劳驾,请看上面我给爱元元的哥哥的回帖2003-8-8)

 
如果用来传记录的,可以用队列啊
 
你可以先生成临时文件或者临时表,传送完成,再写入数据库
 
接受数据的时候,如果超过TCP的包的大小,TCP会自动分包,你就地判断收到的数据完整后自己再合并起来,这时的缓冲区不用太大,因为每次TCP传输来的文件分包后不会很大。
而发送大数据量的时候,直接把它读到流里去,一下发送出去,具体的没帧发送多少,TCP自己会去做处理的,不用管它。
 
谢谢,几句话,顿开茅塞。
 
多人接受答案了。
 
后退
顶部