IdUDPClient和IdUDPServer的问题请教

hackergirl 2009-05-07 01:32:35
我用了IdUDPClient和IdUDPServer这两个控件做了个局域网信息发送软件,
代码如下:


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdUDPServer, IdBaseComponent, IdComponent, IdUDPBase,
IdUDPClient, StdCtrls,IdSocketHandle, IdAntiFreezeBase, IdAntiFreeze;

type
TJ=Record
SendName:String;
Msg:String[100];
end;

type
TForm1 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
Edit2: TEdit;
Edit4: TEdit;
Label3: TLabel;
Memo1: TMemo;
Edit5: TEdit;
Button1: TButton;
UDPC: TIdUDPClient;
UDPS: TIdUDPServer;
procedure Button1Click(Sender: TObject);
procedure UDPSUDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
procedure FormCreate(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject); //向远程主机发送信息
begin
Memo1.Lines.Add(Edit5.Text);
UDPC.Send(Edit5.Text);
end;

procedure TForm1.UDPSUDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
TTF:String;
begin
TTF:=UDPS.ReceiveString(2000); //获取字符串信息
Memo1.Lines.Add(TTF);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
UDPC.Host:=Edit1.Text; //设定远程IP
UDPC.Port:=StrToInt(Edit2.Text); //设定远程端口
UDPC.ReceiveTimeout:=2000; //设置超时时间
UDPS.DefaultPort:=StrToInt(Edit4.Text); //设置本地端口
UDPS.Active:=True; //IdUPDServer开始监听
end;

end.


当我发送字符串的时候,要发送两次,也就是说要连续按下两次Button1,
IdUDPServer才能接收得到IdUDPClient发送过来的字符串.
请问是什么原因?我要怎样做,才能发送一次,用IdUDPServer.ReceiveString方法就能接收过来呢?
谢谢!
...全文
342 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
hackergirl 2009-05-07
  • 打赏
  • 举报
回复
我的发送端只用:IdUDPClient;
接收端只用:IdUDPServer;
嗯.你的代码确实能成功地接收到发送端发送过来的字符,
在此我想知道为什么IdUDPServer.ReceiveString方法接收不到呢?
还是我用这个方法用得不正确?
hongqi162 2009-05-07
  • 打赏
  • 举报
回复
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdUDPClient, IdBaseComponent, IdComponent, IdUDPBase,
IdUDPServer, StdCtrls,IdSocketHandle;

type
TForm1 = class(TForm)
Button1: TButton;
IdUDPServer1: TIdUDPServer;
IdUDPClient1: TIdUDPClient;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
self.IdUDPServer1.DefaultPort:=1984;
self.IdUDPServer1.Active:= true;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
self.IdUDPClient1.Send('127.0.0.1',1984,'fdsafdsa');
end;

procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
sStream: TStringStream;
begin
sStream:= TStringStream.Create('');
try
sStream.CopyFrom(AData,AData.Size);
Memo1.Lines.Add(sStream.DataString);
finally
sStream.Free;
end;
end;

end.


这就是一个既能发送也能接收的indy udp demo
hongqi162 2009-05-07
  • 打赏
  • 举报
回复
你的Server端发送的是什么,在UDPSUDPRead里你用TMemroyStream来处里AData

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧