你自己看看
unit Main;interfaceuses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, NMUDP, ComCtrls;type
  TFrmChat = class(TForm)
    NMUDP1: TNMUDP;
    EditIP: TEdit;
    EditPort: TEdit;
    EditMyTxt: TEdit;
    CbName: TComboBox;
    BtSend: TButton;
    BtClear: TButton;
    MemoReceive: TMemo;
    SaveDialog1: TSaveDialog;
    BtSave: TButton;
    StatusBar1: TStatusBar;
    MeSendTxt: TMemo;
    procedure BtSendClick(Sender: TObject);
    procedure NMUDP1DataReceived(Sender: TComponent; NumberBytes: Integer;
      FromIP: String; Port: Integer);
    procedure NMUDP1InvalidHost(var handled: Boolean);
    procedure NMUDP1DataSend(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure BtClearClick(Sender: TObject);
    procedure BtSaveClick(Sender: TObject);
    procedure EditMyTxtKeyPress(Sender: TObject; var Key: Char);
    procedure MeSendTxtKeyPress(Sender: TObject; var Key: Char);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
   Function Trun_ip(S:string):string;
var
  FrmChat: TFrmChat;implementation{$R *.DFM}Function Trun_ip(S:string):string;
var s1,s2,s3,ss,sss,Head:string;
    n,m:integer;
begin
 sss:=S;
 n:=pos('.',s);
 s1:=copy(s,1,n);
 m:=length(s1);
 delete(s,1,m);
 Head:=copy(s1,1,(length(s1)-1));
 n:=pos('.',s);
 s2:=copy(s,1,n);
 m:=length(s2);
 delete(s,1,m);
 n:=pos('.',s);
 s3:=copy(s,1,n);
 m:=length(s3);
 delete(s,1,m);
 ss:=sss;
 if strtoint(Head) in [1..126] then ss:=s1+'255.255.255'; //1~126.255.255.255 (A类网)
 if strtoint(Head) in [128..191] then ss:=s1+s2+'255.255';//128~191.XXX.255.255(B类网)
 if strtoint(Head) in [192..254] then ss:=s1+s2+s3+'255'; //192~254.XXX.XXX.255(C类网)
  Result:=ss;
end;procedure TFrmChat.BtSendClick(Sender: TObject);
var
 MyStream: TMemoryStream;
 MySendTxt: String;
 Iport,icode:integer;
 PcUser:PChar;
 DwUSize:DWORD;
Begin
 Val(EditPort.Text,Iport,icode);
 if icode<>0 then
  begin
   Application.MessageBox('端口必须为数字,请重新输入!','信息',MB_ICONINFORMATION+MB_OK);
   Exit;
  end;
 NMUDP1.RemoteHost := EditIP.Text; {远程主机}
 NMUDP1.LocalPort:=Iport; {本地端口}
 NMUDP1.RemotePort := Iport; {远程端口}
 MysendTxt := MeSendTxt.Lines.Text;
 //MySendTxt := EditMyTxt.Text;
 MyStream := TMemoryStream.Create; {建立流}
 try
  MyStream.Write(MySendTxt[1], Length(MeSendTxt.Text));{写数据}
 // MyStream.Write(MySendTxt[1], Length(EditMyTxt.Text));{写数据}
  NMUDP1.SendStream(MyStream); {发送流}
 // MemoReceive.Lines.Add('接收到来自主机'+FromIP+'的信息:'+MeSendTxt.Text);
  MeSendTxt.Clear;
 finally
  MyStream.Free; {释放流}
 end;
end;
procedure TFrmChat.NMUDP1DataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
var
MyStream: TMemoryStream;
MyReciveTxt,Name,Result: String;
PcUser,PcComputer :PChar;
DwUSize,dwCSize:DWORD;
begin
 MyStream := TMemoryStream.Create; {建立流}
 try
  NMUDP1.ReadStream(MyStream);{接收流}
  SetLength(MyReciveTxt,NumberBytes);{NumberBytes为接收到的字节数}
  MyStream.Read(MyReciveTxt[1],NumberBytes);{读内存流中所有的数据}   DwCSize := MAX_COMPUTERNAME_LENGTH + 1;
   DwUSize := 21; // 用户名长度不大于20个字符
   Name:='';
   Result:='';
   GetMem( pcUser, dwUSize );
   GetMem( pcComputer, dwCSize );
   try
      if Windows.GetUserName( pcUser, dwUSize ) then
         Name := pcUser;
      if Windows.GetComputerName( pcComputer, dwCSize ) then
         Result := pcComputer;
   finally
      FreeMem( PcUser );
      FreeMem(PcComputer);
   end;
  MemoReceive.Lines.Add('接收到来自主机'+FromIP+'的信息:'+MyReciveTxt);
  MemoReceive.Lines.Add('接收到来自主机'+Name+'的信息:'+MyReciveTxt);
  MemoReceive.Lines.Add('接收到来自主机'+Result+'的信息:'+MyReciveTxt);
 finally
  MyStream.Free; {释放流}
 end;
end;procedure TFrmChat.NMUDP1InvalidHost(var handled: Boolean);
begin
 Application.MessageBox('对方IP地址不正确,请重新输入!','信息',MB_ICONINFORMATION+MB_OK);
end;procedure TFrmChat.NMUDP1DataSend(Sender: TObject);
begin
 StatusBar1.SimpleText:='信息成功发出!';
end;procedure TFrmChat.FormCreate(Sender: TObject);
begin
 EditIP.Text:='127.0.0.1';
 EditPort.Text:='8868';
 BtSend.Caption:='发送';
 BtClear.Caption:='清除记录';
 BtSave.Caption:='保存记录';
 MemoReceive.ScrollBars:=ssBoth;
 MemoReceive.Clear;
 EditMyTxt.Text:='在这里输入信息,然后点击发送.'; StatusBar1.SimplePanel:=true;
end;procedure TFrmChat.BtClearClick(Sender: TObject);
begin
 MemoReceive.Clear;
end;procedure TFrmChat.BtSaveClick(Sender: TObject);
begin
 if SaveDialog1.Execute then MemoReceive.Lines.SaveToFile(SaveDialog1.FileName);
end;procedure TFrmChat.EditMyTxtKeyPress(Sender: TObject; var Key: Char);
begin
 if Key=#13 then BtSend.Click;
end;procedure TFrmChat.MeSendTxtKeyPress(Sender: TObject; var Key: Char);
begin
 if Key=#13 then BtSend.Click;
end;end.

解决方案 »

  1.   

    unit Unit_client;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ScktComp, StdCtrls, ComCtrls, ExtCtrls;type
      TForm1 = class(TForm)
        S1: TStatusBar;
        M1: TMemo;
        Client: TClientSocket;
        Edit1: TEdit;
        Button1: TButton;
        Bevel1: TBevel;
        Label1: TLabel;
        edtHost: TEdit;
        Label2: TLabel;
        edtPort: TEdit;
        btnConnect: TButton;
        bntDisConnect: TButton;
        procedure ClientConnect(Sender: TObject;
          Socket: TCustomWinSocket);
        procedure ClientRead(Sender: TObject; Socket: TCustomWinSocket);
        procedure ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure M1Click(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure btnConnectClick(Sender: TObject);
        procedure Edit1KeyPress(Sender: TObject; var Key: Char);
        procedure FormCreate(Sender: TObject);
        procedure bntDisConnectClick(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      TotalLen:Integer;implementation
    uses  ShellAPI;
    {$R *.DFM}procedure TForm1.ClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
    S1.Panels.Items[0].Text:='Connect Received';
    S1.Panels.items[1].text:='';
    end;procedure TForm1.ClientRead(Sender: TObject; Socket: TCustomWinSocket);
    var
      re:pchar;
      sbuf:string;
      relong:integer;
    begin
        re:=nil;
        while socket.ReceiveLength>0 do
          begin
            //申请内存
            re:=AllocMem(socket.receivelength);
          TRY
            relong:=socket.ReceiveLength;
            Socket.ReceiveBuf(re^,Socket.receivelength);
            sBuf:=strpas(re);
            Setlength(sbuf,relong);        //count lenght
            TotalLen:=TotalLen+ relong;
            S1.Panels.Items[1].Text:='Total Received (Byte): ' + IntToStr(TotalLen);
            S1.Update();
          FINALLY
            freemem(re);
          END;
        M1.Lines.Add(sbuf);
      end;
    end;procedure TForm1.ClientDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
      S1.Panels.Items[0].Text:='Close Connect With Host';
      S1.Panels.Items[0].Text:='';
      M1.Lines.Clear;
      edit1.Text:='';
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      if Client.Active then
        Client.Close;
    end;procedure TForm1.M1Click(Sender: TObject);
    begin
    Edit1.SetFocus;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
        ShellExecute(self.handle,nil,Pchar(Application.EXEname),nil,nil,SW_Normal);
    end;procedure TForm1.btnConnectClick(Sender: TObject);
    begin
        Client.Address:=edtHost.Text;
        Client.Port:=strtoint(edtPort.Text);
        Client.Active:=true;
    end;procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
    begin
    if key=#13 then
      begin
        if not Client.Active then
            btnConnectClick(Sender);
        Client.Socket.SendText(Edit1.Text);
        edit1.SelectAll;
        key:=#0;
      end;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
        edtHost.Text:='10.14.61.70';
        edtPort.Text:='7';
        TotalLen:=0;
    end;procedure TForm1.bntDisConnectClick(Sender: TObject);
    begin
        Client.Active:=False;
    end;end.
    客户端
      

  2.   

    请问TNMUDP在哪添加?
    位于哪个Compoents Pages下?
    我用的是Delphi6.0英文企业版,我找了半天也没有找到NMUDP在哪
    请告诉我好吗,拜托了!!
      

  3.   

    服务端:
    unit Unit_Server;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ComCtrls, StdCtrls, ScktComp,Winsock, ExtCtrls;type
      TForm1 = class(TForm)
        Server: TServerSocket;
        m1: TMemo;
        S1: TStatusBar;
        btnSend: TButton;
        edtSend: TEdit;
        Label1: TLabel;
        Label2: TLabel;
        btnOneSend: TButton;
        Label3: TLabel;
        Label4: TLabel;
        Bevel1: TBevel;
        cbxID: TComboBox;
        procedure ServerClientConnect(Sender: TObject;
          Socket: TCustomWinSocket);
        procedure ServerClientRead(Sender: TObject; Socket: TCustomWinSocket);
        procedure FormCreate(Sender: TObject);
        procedure ServerAccept(Sender: TObject; Socket: TCustomWinSocket);
        procedure ServerClientError(Sender: TObject; Socket: TCustomWinSocket;
          ErrorEvent: TErrorEvent; var ErrorCode: Integer);
        procedure btnSendClick(Sender: TObject);
        procedure ServerClientDisconnect(Sender: TObject;
          Socket: TCustomWinSocket);
        procedure btnOneSendClick(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    Type UsrRec=Record
                  SocketID:Integer;
                  UsrName:string;
                  Passwd:string;
                  IP:string;
                  ReceivingData:string;
                  End;var
      Form1: TForm1;
      buf:string;
      bEUserName,bEPasswd:Boolean;
      Usr:^UsrRec;implementation{$R *.DFM}procedure TForm1.ServerClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    Var
      strIp,strHost:string;
      Count:Integer;
    begin
      strIp:=Socket.RemoteAddress;
      strHost:=Socket.RemoteHost;
      M1.Lines.Add('SomeOne Login From');
      M1.Lines.add(#9'SocketID:'+Inttostr(Socket.SocketHandle));
      cbxID.Items.Add(Inttostr(Socket.SocketHandle));
      M1.lines.add(#9'IP:'+strIp);
      M1.Lines.Add(#9'Host:'+strHost);
      Count:=Server.Socket.ActiveConnections;
      S1.Panels.Items[1].Text:='OnLine user: '+IntToStr(Count);
    end;procedure TForm1.ServerClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      p:pchar;
      length:longint;
      Count,i:Integer;
    begin
        p:=nil;
        while socket.ReceiveLength>0 do begin
            length:=socket.receivelength;
            Getmem(p,length);
            TRY
                socket.ReceiveBuf(p^,socket.receivelength);
                Count:=Server.Socket.ActiveConnections;
                for i:=0 to Count-1 do
                    Server.Socket.Connections[i].SendBuf(p^,length);
            FINALLY
                FreeMem(p);
            END;
        end;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
        //start server when application run
        Server.Active:=true;
        S1.Panels.Items[0].Text:='Server Starts. Host:'+Server.Socket.LocalHost+'  Port:'+inttostr(Server.Port);
        self.Caption:=S1.Panels.Items[0].Text;
        Application.Title:=S1.Panels.Items[0].Text;
        S1.Panels.Items[1].Text:='OnLine user Count: '+IntToStr(Server.Socket.ActiveConnections);
    end;procedure TForm1.ServerAccept(Sender: TObject; Socket: TCustomWinSocket);
    var
      Tempstr:pchar;
    begin
        TempStr:=pchar('Welcome To Chat Test Server    '#13#10);
        socket.SendText(TempStr);
        TempStr:=pchar('#######################################'#13#10);
        socket.SendText(TempStr);
        TempStr:=pchar('All your words will be sent to all online people'#13#10);
        socket.SendText(TempStr);
    end;procedure TForm1.ServerClientError(Sender: TObject;
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
    begin
    //Error Conditions
    Case ErrorCode Of
      10054:M1.lines.add('one connection is reset by remote side.');
      Else
        M1.Lines.Add('Error Happen, Error Code:'+InttoStr(errorCode));
    End;
    ErrorCode:=0;
    end;procedure TForm1.btnSendClick(Sender: TObject);
    var
      i:integer;
      Count:Integer;
    begin
        Count:=Server.Socket.ActiveConnections;
        for i:=0 to Count-1 do
          Server.Socket.Connections[i].SendText(edtSend.text);
    end;procedure TForm1.ServerClientDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    Var
        Count:Integer;
        IDIndex:Integer;
    begin
        M1.Lines.add('Usr Offline');
        M1.Lines.add('      SocketID:'+Inttostr(Socket.SocketHandle));
        IDIndex:=cbxID.Items.IndexOf( Inttostr(Socket.SocketHandle));
        cbxID.Items.Delete(IDIndex);
        //this event happens before user leave
        Count:=Server.Socket.ActiveConnections-1;
        S1.Panels.Items[1].Text:='OnLine user:'+Inttostr(Count);
    end;procedure TForm1.btnOneSendClick(Sender: TObject);
    var
      ID:Integer;
      Socket:TCustomWinSocket;
    begin
      if cbxID.Text='' then
        exit;  
      ID:=strtoint(cbxID.text);
      //Create a socket with exist socket handle
      Socket:=TCustomWinSocket.Create(ID);
      Socket.SendText(EdtSend.text);
    end;end.