一个有关TClientSocket收发TCP包的问题(45分)

  • 主题发起人 主题发起人 base7
  • 开始时间 开始时间
B

base7

Unregistered / Unconfirmed
GUEST, unregistred user!
建立TCP连接之后
如果服务端快速发包,在Onread事件中就会少接收很多消息包
大家有没有这种经历?不知你们是怎么解决的呢?
 
Delphi7已经没有ClientSocket ServerSocket 这套空间了,好是改用INDY控件吧!
 
是啊,可是idTCPClient控件用不懂啊
它没有Onread事件,好像每次要自己主动去取,这可受不了
 
是呀用INDY9吧。很好用哦。
 
我研究过indy的几个有关idTCPClient的demoes
用一个Timer定时在那取数据,这不是搞笑吗?
我做的是一个监控程序,有可能一秒钟有几百条数据,也有可能一个小时也没有一条数据,
有高人解释一下如何使用Indy控件吗?分数不是问题
 
不用自己去取,使用idTCPServer等待idTCPClient传回来数据流!

procedureIdTCPServerExecute(
AThread: TIdPeerThread);
var
IPPos, i: Integer;
InfoStream: TMemoryStream; //接收到的流
RecString: TStringList;
TmpTcpClient: TIdTcpClient;
Comparser_Tmp: TComparser; //处理客户端定时发送各类信息的指令字符串
begin
with AThread.Connection do
begin
while connected do
begin
ReadStream(FDataStream, -1, True); //接收返回的流
if SizeOf(FDataStream) > 0 then
begin
FDataStream.Position := 0;
FDataStream.ReadBuffer(FInfoNo, SizeOf(FInfoNo));
end;
finally
Disconnect;
end;
end;
end;
这样就可以接受回来的流了!
 
不用自己去取,使用idTCPServer等待idTCPClient传回来数据流!

procedureIdTCPServerExecute(
AThread: TIdPeerThread);
var
FDataStream: TMemoryStream; //接收到的流
begin
with AThread.Connection do
begin
while connected do
begin
FDataStream := TMemoryStream.Create;
try
ReadStream(FDataStream, -1, True); //接收返回的流
if SizeOf(FDataStream) > 0 then
begin
FDataStream.Position := 0;
FDataStream.ReadBuffer(FInfoNo, SizeOf(FInfoNo));
end;
finally
Disconnect;
end;
end;
end;
这样就可以接受回来的流了!
 
用TClientSocket没有问题,我连续的发送一个几百M的文件过来都没问题,关键是你处理的
方式
 
Tcp/ip协议是不会掉包的,肯定是你的处理有问题了。
如果发送端发出的包没有被接收,在有效时间内,应该存放在缓冲区里。
 
to sailorhdx:
可是我编写的是连接的客户端啊,也用idTCPServer吗?(服务器端用C编的)
to 张无忌,chenzx:
这样的话那麻烦大了...
 
TClientSocket用非组塞和组塞都很好用,不过都要检查实际接受到的数据量大小。
 
如何检查数据量大小呢?
能否给个简单的例子? 谢谢 [:)]
 
socket.ReceiveBuf方法返值就是接收到的实际大小
 
socker.ReceiveLength是大小
 
不要看接受的次数,而要看接受的长度。

不管接受多少次,肯定最终的数据量不会变。
 
这问题已问了多次了?
你搜搜旧帖,
关键你要建立自己的通讯规则
 

Similar threads

S
回复
0
查看
730
SUNSTONE的Delphi笔记
S
后退
顶部