大家好,我现在想写一个通讯软件,用Delphi xe7,选择了IdUDPServer与IdUDPClient这两个控件,客户端现在用一个按钮发送与接收信息:procedure Tfm_main.Button1Click(Sender: TObject);
var
MessageID: Integer;
ThisMessage: String;
ReceivedString: String;
begin
UDPClient.Send('ABC'); //用这句发送。
ReceivedString := UDPClient.ReceiveString(); //用这句来接收
end;上面的通讯都没有问题,但我想实现的功能如下:有A 与 B 两个客户端,还有一个S的服务端,要实现A 通过 S 向 B 发信息,现在问题是,TIdUDPClient 这个控件有没有可以即时接收服务器发过来的信息的方法,现在用了一个Timer控件来不断接收,代码如下:
procedure Tfm_main.Timer1Timer(Sender: TObject);
var
ReceivedString: string;
begin
if not vconetion then
exit;
ReceivedString := UDPClient.ReceiveString();
if ReceivedString <> '' then
begin
UDPMemo.Lines.Add('Received:' + ReceivedString);
end;end;但这样好卡,也不现实,我想问,怎么解决这个问题,当服务器发信息时才响应?
谢谢
var
MessageID: Integer;
ThisMessage: String;
ReceivedString: String;
begin
UDPClient.Send('ABC'); //用这句发送。
ReceivedString := UDPClient.ReceiveString(); //用这句来接收
end;上面的通讯都没有问题,但我想实现的功能如下:有A 与 B 两个客户端,还有一个S的服务端,要实现A 通过 S 向 B 发信息,现在问题是,TIdUDPClient 这个控件有没有可以即时接收服务器发过来的信息的方法,现在用了一个Timer控件来不断接收,代码如下:
procedure Tfm_main.Timer1Timer(Sender: TObject);
var
ReceivedString: string;
begin
if not vconetion then
exit;
ReceivedString := UDPClient.ReceiveString();
if ReceivedString <> '' then
begin
UDPMemo.Lines.Add('Received:' + ReceivedString);
end;end;但这样好卡,也不现实,我想问,怎么解决这个问题,当服务器发信息时才响应?
谢谢
IdUDPClient1.ReceiveTimeout := 50; //设置等待时间很短,0.05秒
S := IdUDPClient1.ReceiveString(); //接收,超时,下次再来接收以上可以简单地稍微解决卡的问题
如果要效果好,还是应该把接收放到单独的线程中去完成,收到内容后处理,之后通知主线程显示什么的。