帮忙:使用indy进行server和client的通信问题 ( 积分: 100 )

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

bryanliu

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大侠,我刚试着做个indy的通信软件,客户端writeln命令,要求取得服务器端的驱动器字符串,服务器端接受到命令getdrvs后,用函数getdrivename到driveCombobox里取得该字符串,并writeln(getdrvs)。可是当客户机取到一次后,服务器就没有响应了。但若服务器直接writeln('字符串'),则客户机能正常接受到。
搞不懂怎么回事,我试过getdrivesname()这个函数不带循环的话不会出错,是不是客户端来不及等待服务器返回函数结果就去readln,结果出问题?
该怎么解决这个问题?因为我最后要的效果是搜索整个服务器文件,将搜索到的文件名返回给客户,这样搜索函数的执行时间一定很长。

服务器端:
procedure TForm1.idTcpServerExecute(AThread: TIdPeerThread);
var
sCommand,cmd: string;
begin
with AThread.Connection do
begin
sCommand := ReadLn();
msg := '命令来自于客户机:'+ AThread.Connection.Socket.Binding.PeerIP;
AThread.Synchronize(AddLogEntry);

if AnsiStartsText('GETDRVS ', sCommand) then //取得驱动器名
AThread.Connection.Writeln(getdrivename(DriveComboBox1));
end;
end;
function getdrivename(drv:TdriveCombobox):string;
var i:Integer;
d:string;
begin //生成盘符的字符串
for i:=0 to drv.Items.Count-1 do
d:=d+'*'+copy(drv.Items,1,2)+'|';
result:=d;
end;
--------------
客户端
procedure TclientForm.BtnExplorClick(Sender: TObject);
begin
with IdTCPClient do
begin
WriteLn('GETDRVS ');
listbox1.Items.Add(readln()); //要取得的服务器端的驱动器字符串
end;
end;
 
各位大侠,我刚试着做个indy的通信软件,客户端writeln命令,要求取得服务器端的驱动器字符串,服务器端接受到命令getdrvs后,用函数getdrivename到driveCombobox里取得该字符串,并writeln(getdrvs)。可是当客户机取到一次后,服务器就没有响应了。但若服务器直接writeln('字符串'),则客户机能正常接受到。
搞不懂怎么回事,我试过getdrivesname()这个函数不带循环的话不会出错,是不是客户端来不及等待服务器返回函数结果就去readln,结果出问题?
该怎么解决这个问题?因为我最后要的效果是搜索整个服务器文件,将搜索到的文件名返回给客户,这样搜索函数的执行时间一定很长。

服务器端:
procedure TForm1.idTcpServerExecute(AThread: TIdPeerThread);
var
sCommand,cmd: string;
begin
with AThread.Connection do
begin
sCommand := ReadLn();
msg := '命令来自于客户机:'+ AThread.Connection.Socket.Binding.PeerIP;
AThread.Synchronize(AddLogEntry);

if AnsiStartsText('GETDRVS ', sCommand) then //取得驱动器名
AThread.Connection.Writeln(getdrivename(DriveComboBox1));
end;
end;
function getdrivename(drv:TdriveCombobox):string;
var i:Integer;
d:string;
begin //生成盘符的字符串
for i:=0 to drv.Items.Count-1 do
d:=d+'*'+copy(drv.Items,1,2)+'|';
result:=d;
end;
--------------
客户端
procedure TclientForm.BtnExplorClick(Sender: TObject);
begin
with IdTCPClient do
begin
WriteLn('GETDRVS ');
listbox1.Items.Add(readln()); //要取得的服务器端的驱动器字符串
end;
end;
 
需要同步的话,你可以在 放一个 在 Indy Misc 面板上的 IdAntiFreeze1 就可以解决问题.
 
procedure TForm1.idTcpServerExecute(AThread: TIdPeerThread);
var
sCommand,cmd: string;
begin
while not AThread.Terminated do
begin
with AThread.Connection do
begin
sCommand := ReadLn();
msg := '命令来自于客户机:'+ AThread.Connection.Socket.Binding.PeerIP;
AThread.Synchronize(AddLogEntry);

if AnsiStartsText('GETDRVS ', sCommand) then //取得驱动器名
AThread.Connection.Writeln(getdrivename(DriveComboBox1));
end;
end;
end;
 
已经放了IdAntiFreeze1
不管用
 
后退
顶部