[老生长谈]再问TClientSocet正确传输的问题! ( 积分: 100 )

  • 主题发起人 主题发起人 楚非帆
  • 开始时间 开始时间
我也是用INDY组件,服务器查询到的数据保存为流,直接发送流就可以了,客户端再重组数据
 
TCP传输,是基于流传输,当然会粘包。如果是UDP,就不会的。
所以,你在向客户端传输数据时, 一定要定义好协议。比如,协议开头(*),协议命令(#1至#255),协议内容长度,协议内容。协议的命令关键字。客户端收到流数据时,进行解析。
Socket.ReceiveLength 这个是偷窥接收缓冲区的大小,在进行大量数据传输时,这个值是不准确的。因为缓冲区是随时变化的。
应该看ReceiveBuf函数的返回值。iRet才是真正接收到的数据。
iRet:=Socket.ReceiveBuf(TempBuf[1],1024*100);

以前做图像传输时,客户端接收到的图像老是错位。后来发现是因为 Socket.ReceiveLength这个值不准备。改过之后,现在很稳定。
 
如何正确接收大小呢?
 
我是这样子做,先发一个命令,表示开始发送文件,然后发送文件内容,发送完成成后发送结束命令
 
2、自定义数据传输协议(定义包头、包体。包头中包括包体长度)这种方法比1要好一些,但是仍然存在有的数据不能正常接受。
============================================================================
你的接收算法有bug!我也是这么做的就一点没问题。
TCP/IP是stream,你发送100字节再200字节,接收到的可能情况是:
20字节,65字节,114字节...这样一个流,当然,收到的字节总数是300字节。所以要自己还原成100字节一个包和200字节一个包。
 
帮顶

--------签名档---------------------------

惊爆开源站

http://www.source520.com

80G源码电子书免费免注册下载,大量精辟技术文档库随时更新
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部