我是用了两个TUDPSocket, 一个发送数据,另一个接受,但不知道这个控件怎么用,我使用SendTo和ReceiveFrom收发数据,但接受方无法接受。
请问TUDPSocket究竟该怎么用,SendTo何ReceiveFrom的每个参数是什么意思

解决方案 »

  1.   

    帮助文件里面写得清清楚楚,你进行无线通讯,必须知道双方的ip,和port,而且
    port 应该一直,才能够通讯,sendto  是法消息给对方的函数,中间包括内容,地址等参数,receivefrom是接受消息,一般不用,都使用接受流的方式进行,对于较小的文字的话,可以使用receivetext 方式,最好先将帮助仔细看一遍
      

  2.   

    一有数据到达,就会触发OnReceive事件,在OnReceive事件里面处理数据接收
      

  3.   

    最好使用SendBuf或者SendStream、ReceiveBuf.
      

  4.   

    谁试过啦?能不能把代码贴出来呀,我怎么试也不能触发OnReceive事件呀。
      

  5.   

    一个聊天程序的部分代码,你自己研究一下吧。unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, NMUDP, ExtCtrls, Buttons,
      Menus,ComCtrls,WinSock;//file://增加WinSock;type
      TForm1 = class(TForm)
        Panel1: TPanel;
        Panel2: TPanel;
        NMUDP1: TNMUDP;
        ListBox1: TListBox;
        Memo1: TMemo;
        Button1: TButton;
        Button2: TButton;
        Edit1: TEdit;
        Label1: TLabel;
        BitBtn1: TBitBtn;
        Button3: TButton;
        procedure FormShow(Sender: TObject);
        procedure BitBtn1Click(Sender: TObject);
        procedure NMUDP1DataReceived(Sender: TComponent; NumberBytes: Integer;
          FromIP: String; Port: Integer);
        procedure Edit1KeyPress(Sender: TObject; var Key: Char);
        procedure Button1Click(Sender: TObject);
        //procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      ComputerName: array[0..127] of Char;implementation{$R *.DFM}procedure TForm1.FormShow(Sender: TObject);
    var     sz:dword;begin     sz := SizeOf(Computername);     GetComputerName(ComputerName, sz);//得到本机的标识     ListBox1.Items.Clear;     ListBox1.Items.Add('大家');//在网友清单中,增加"大家"和     ListBox1.Items.Add(ComputerName);//本机名称     ListBox1.ItemIndex:=0;end;
    procedure TForm1.BitBtn1Click(Sender: TObject);
    var    MyStream: TMemoryStream;      TmpStr: String;       i:integer;     Begin     //if Edit1.Text<>'' then file://如果所说的内容不为空,则发送。      begin          NMUDP1.ReportLevel := Status_Basic;          //NMUDP1.RemotePort :=8888;//端口为:8888,可以自己定义,但必须与LocalPort相一致。          if ListBox1.Items[ListBox1.ItemIndex]=ComputerName then            Edit1.Text:=ComputerName+'自言自语道:'+Edit1.Text //file://如果和自己对话.          Else            Edit1.Text:=ComputerName+'对'+ListBox1.Items[listbox1.itemindex]+'说:'+Edit1.Text;            TmpStr :=Edit1.text;            MyStream := TMemoryStream.Create;           try           MyStream.Write(TmpStr[1], Length(Edit1.Text));            if ListBox1.ItemIndex=0 then             begin               for i:=1 to ListBox1.Items.Count-1 do //file://如果选择"大家",则对所有的网友发送信息                  begin                    NMUDP1.RemoteHost :=ListBox1.Items[i];//远程主机的名称或地址.                    NMUDP1.SendStream(MyStream);//发送信息.                  End;                   end                      else //如果私聊               begin               NMUDP1.RemoteHost :=ListBox1.Items[ListBox1.itemindex]; //file://仅对所选中的网友.              NMUDP1.SendStream(MyStream);             End;            finally           MyStream.Free;          end;          Edit1.Text:='';          Edit1.SetFocus;        end;
         //else       Edit1.SetFocus;     end;
    procedure TForm1.NMUDP1DataReceived(Sender: TComponent;
      NumberBytes: Integer; FromIP: String; Port: Integer);
    var          MyStream: TMemoryStream;          TmpStr: String;         begin         MyStream := TMemoryStream.Create;          try           NMUDP1.ReadStream(MyStream);           SetLength(TmpStr,NumberBytes);           MyStream.Read(TmpStr[1],NumberBytes);           Memo1.Lines.Add(TmpStr); //file://显示对话的内容.            finally           MyStream.Free;         end;          end;
    procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
    var        MyStream: TMemoryStream;        TmpStr: String;        i:integer;        Begin          if (key=#13) and (Edit1.Text<>'') then //file://如果所说的内容不为空,且最后一个按键为"Enter",则发送。          begin            NMUDP1.ReportLevel := Status_Basic;            NMUDP1.RemotePort :=8888;            if ListBox1.Items[ListBox1.ItemIndex]=ComputerName then             Edit1.Text:=ComputerName+'自言自语道:'+Edit1.Text              else                Edit1.Text:=ComputerName+'对'+ListBox1.Items[listbox1.itemindex]+'说:'+Edit1.Text;                TmpStr :=Edit1.text;                MyStream := TMemoryStream.Create;                 try                  MyStream.Write(TmpStr[1], Length(Edit1.Text));                  if ListBox1.ItemIndex=0 then                  begin                   for i:=1 to ListBox1.Items.Count-1 do                    begin                         NMUDP1.RemoteHost :=ListBox1.Items[i];                     NMUDP1.SendStream(MyStream);                   end;                    end                     else                     begin                        NMUDP1.RemoteHost :=ListBox1.Items[ListBox1.itemindex];                        NMUDP1.SendStream(MyStream);                     end;                   finally                    MyStream.Free;                    end;                      Edit1.Text:='';                      edit1.SetFocus;                       end
                          else                       Edit1.SetFocus;                       end;procedure TForm1.Button1Click(Sender: TObject);var        InputString:String;          begin //file;//增加网友,输入的可以是IP地址或计算机名称。          InputString:=InputBox('增加人员', 'IP地址或计算机名', '');            if Inputstring<>'' then ListBox1.Items.Add(Inputstring);            ListBox1.ItemIndex:=0;            end;
    procedure TForm1.Button3Click(Sender: TObject);
           begin //file://删除当前选中的网友,但"大家"不能被删除.         if ListBox1.ItemIndex<>0 then ListBox1.Items.Delete(ListBox1.ItemIndex);       end;
    end.
      

  6.   

    人家说的是TUDPSocket,你用的是NMUDP。