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

  • 主题发起人 主题发起人 楚非帆
  • 开始时间 开始时间

楚非帆

Unregistered / Unconfirmed
GUEST, unregistred user!
从数据库中读取100条数据循环发送给客户端。每条数据总长度>8K
组件用TserverSocket and TclientSocket!
客户端如何稳定的、正确的收取每一条数据?

我尝试过的方法
1、只是不断用ReceiveBuf,这种方法肯定不行,有粘包现象存在。
2、自定义数据传输协议(定义包头、包体。包头中包括包体长度)这种方法比1要好一些,但是仍然存在有的数据不能正常接受。

疑问:
Receivebuf返回值到底是buf的长度还是-1
参见http://www.delphibbs.com/delphibbs/dispq.asp?lid=2140578

请有经验的专家回答!不胜感激!也请有相同疑问的dfw顶之!
email:delphi@tmop.net
 
从数据库中读取100条数据循环发送给客户端。每条数据总长度>8K
组件用TserverSocket and TclientSocket!
客户端如何稳定的、正确的收取每一条数据?

我尝试过的方法
1、只是不断用ReceiveBuf,这种方法肯定不行,有粘包现象存在。
2、自定义数据传输协议(定义包头、包体。包头中包括包体长度)这种方法比1要好一些,但是仍然存在有的数据不能正常接受。

疑问:
Receivebuf返回值到底是buf的长度还是-1
参见http://www.delphibbs.com/delphibbs/dispq.asp?lid=2140578

请有经验的专家回答!不胜感激!也请有相同疑问的dfw顶之!
email:delphi@tmop.net
 
不是很清楚你的要求

帮助里面介绍说ReceiveLength在传送二进制流的时候是不准确的
Note: While the ReceiveLength method can return an estimate of the size of buffer required to retrieve information from the socket, the number of bytes it returns is not necessarily accurate.

所以通常的做法是先发送一个整形值,告诉他下面我要发多少东西过去,然后接收端就等,一直用ReceiveBuf去读,把读到的数据拼起来看大小,如果到了就好了,不到继续读,另外
ReceiveBuf这个函数返回值是表示真正读取的数据个数,不是后面那个count,大概思路是这样,供参考

Reads up to Count bytes from the socket connection into the Buf paramete
如果楼主现在的代码是if ReceiveLength > 0 then begin
……
end;
这样的方式,那么不烦采取我说的方式,如果不是就继续等高手
 
这样的控件我正在用,chenybin的方法比较好
我也有一个问题,
我只允许服务端有一个客户端和它连接,当有其它客户连接它时,就给相应的客户端返回一个信息,说已经有客户和服务端了,同时服务端断开它的连接,这样的做法应该实现,怎么做,请高手帮助
 
我的要求很简单,就是在现在网络情况下,正确的读取Tserversocket发来的每条信息。请做过的朋友帮忙!
 
哪位能做个从数据库中读取>=100条数据循环发送给客户端保证不出错的例子出来,不胜感激!
 
客户端只管发,发玩一次,等待一定的时间再发第二个。
服务端定义一个足够大缓冲区,接受的时候,不要着急收,当onread 的时候, 等待一定的时间。
等待的方法简单
sj是豪秒
applicationsleep(sj)
var
dt:Cardinal
begin
dt:=gettickcount
while gettickcount-dt<sj then application.processmesage;
end;


delphi 自带的socket 控件不好用, 有机会你应该学习socket编程,直接用api自己写socket , 编程会很方便。灵活。
 
如果加上握手信号。等待的时间会很段。
方法是, clientsocket 按一定的格式发到serversocket. serversocket 接收到且数据合法,发送回复到clientsocket. clientsocket 再发第二个,这样循环。

serversocket onread的时候 中的 tcustomsocket 是可以利用的。我上面的方法是1对1, 若多对1的话,就需要使用tcustomsocket了。
 
求详细解法!谢谢先
 
分数不够可在加300分。请dfw帮忙
 
看来只能队列了
 
直接用Socket要好得多。
 
第一:不要握手,时间长,
第二:不要问答式,太慢
第三:充分利用连接池、多线程等
 
渴望知道正确答案
 
目前我变通的方法是:
1、使用INDY组件,这样发送大文件方便不出错;
2、服务器端将查询结果保存到TEST.TXT文件。然后将TEST.TXT文件发送到客户端;
3、客户端接收到TEST.TXT文件再组合成数据表。

个人建议:
1、如果记录多的话,可以一次发送10-20条记录,同样是生成文件再发送。
2、这样处理的话,可以很方便的处理数据表中的image类型字段。
3、如何使用INDY组件,可以参考它自带的demos,建议使用indy 9或indy 10。
 
有点意思,这个变通方法不错。不过应该不是正确的方法!
继续等待
 
如何发送与生成文件没有关系,你可以直接发送查询到的数据集不是更简单,把生成的数据集分成若干个包进行发送,注意包的无序性,要重组、重发等,实现比较简单。
 
当然可以使用数据流来处理。
 
求详细解法
 

Similar threads

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