ClientSocket的简单问题,各位进来看看,请指点(100分)

  • 主题发起人 主题发起人 YinZu
  • 开始时间 开始时间
Y

YinZu

Unregistered / Unconfirmed
GUEST, unregistred user!
我要用 ClientSocket实现这样的功能:
向服务器端发送串,每发送一个串服务器端都会返回一个结果,
现在我要循环向服务器端发送一万个串,每发送一个串,都要等服务器有返回结果才能
发送下一个串,请问如何实现,我选用ClientSocket控件, ClientType 为ctNonBlocking,我已经写了一些代码,可结果总是与预期的不一致,比如我发发送了
10个串,返回只有5个(比如只返回了第2,4,6,8,10个串的结果),
但是如果单步执行,结果就正确,我知道,应该是因为结果还没有返回就又
发送了下一个串,如何解决这种问题,
每发送一个串,等结果返回了才发送下一个串,如果返回超时就报错,请各位指点,最好有相关的代码供参考就最好了,

以下是发送串处的大体算法:有不对的地方,请指点

// 循环发送串
while not Eof(AreaTxtFile) do
begin

//等待,直到有返回值才发送下一条记录
Iflag := 0 ;
repeat
Iflag := Iflag + 1;
if Iflag > 1000000 then
begin
showmessage('time out');
btimeout := True;
break;
end;
until bIsReturn;

if btimeout then
exit;

.
.
.
. //此处为程序中相关的处理
.
.

//发送串前,使返回标识为False
bIsReturn := False;

//发送串
ClientSocket1.Socket.SendText(str);
end;


说明 bIsReturn 为全局变量,标识是否已有值返回,


以下是接收到串的大体算法:
在OnRead事件里,

ReturnValue := ClientSocket1.Socket.ReceiveText;

if ReturnValue <> '0' then
begin
//处理。。。
end;

//接收到值后,使返回标识为True
bIsReturn := True;
 
即然你采用的是应答方式,最好采用阻塞式方式操作。
repeat
Iflag := Iflag + 1;
if Iflag > 1000000 then
begin
showmessage('time out');
btimeout := True;
break;
end;
until bIsReturn;
你的这段程序好象有问题,你在循环中不断的加时间计数,可是却没有让程序有时间处理消息,所以程序始终无法响应收到数据的消息啊,改成下面这样试试
repeat
Iflag := Iflag + 1;
if Iflag > 1000000 then
begin
showmessage('time out');
btimeout := True;
break;
end;
Application.ProcessMessenger;//这一句很重要,让程序有机会响应WIndows消息,包括收到数据的消息。
until bIsReturn;
 
>>10个串,返回只有5个(比如只返回了第2,4,6,8,10个串的结果),但是如果单步执行,结果就正确

估计是你发送得太快,数据黏包了,你每发送一次就延时一下(sleep)试试。
 
粘包的问题可用分隔符解决。
 
这类问题有点麻烦!
我也想知道
学习
 
晕,后面几位不要误导啦,就是我说的问题啊,他的超时是用一个死循环在那计数,当然会超时了,他要么改用一个定时器来完成超时的工作,或者就要象我写的那样加入一个消息处理工作.
 
我现在采用下面这样的方式,使用sleep,请问使用sleep,又使用Application.ProcessMessages;,程序有时间处理消息吗?
请指点:
TO: proman 先谢你了

repeat
sleep(1);
Iflag := Iflag + 1;
if Iflag > 5000 then
begin
showmessage('timeout');
btimeout := True;
break;
end;
Application.ProcessMessages;
until bIsReturn;
 
你那个Sleep(1)只能只处理器停1毫秒,在这里用处不大,没有用.我帮你改一下吧.没有调试,你自己调试,出了问题再问吧.
t: Longword;
repeat
t := GetTickCount;
while GetTickCount - t < 10 do //10毫秒为一个计时单位
Application.ProcessMessages;
IFlag := IFlag + 1;
if Iflag > 500 then //超时设置为5秒钟
begin
showmessage('timeout');
btimeout := True;
end;
until bIsReturn Or BTimeOut;
 
后退
顶部