我用了IdUDPClient和IdUDPServer这两个控件做了个局域网信息发送软件,
代码如下:
unit Unit1;interfaceuses
  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方法就能接收过来呢?
谢谢!

解决方案 »

  1.   

    你的Server端发送的是什么,在UDPSUDPRead里你用TMemroyStream来处里AData
      

  2.   

    unit Unit1;interfaceuses
      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
      

  3.   

    我的发送端只用:IdUDPClient;
    接收端只用:IdUDPServer;
    嗯.你的代码确实能成功地接收到发送端发送过来的字符,
    在此我想知道为什么IdUDPServer.ReceiveString方法接收不到呢?
    还是我用这个方法用得不正确?