谁能给一个在两台机器之间通信的程序?谢了

解决方案 »

  1.   


    二、编写主控程序 
    ---- 1、新建一个项目Client.dpr,并把一个TClientSocket元件放到Form上,它的属性设置如下:Port设为100(端口号可任意设置,只要求双方统一),其它属性按默认值。在窗体上添加两个TEdit:Edit1用来输入发送的字符,Edit2用来输入IP地址;添加两个TButton:Button1点击后用来连接被控机,Button2点击后用来发送字符,然后声明一个私有变量ConnectFlag,表示双方是否连接好: 
           private
             ConnectFlag:Boolean;---- 2、ClientSocket1的OnConnect事件代码如下: 
           procedure TForm1.ClientSocket1Connect
    (Sender: TObject;Socket: TCustomWinSocket);
           begin 
             ConnectFlag:=True; //表示连接成功
           end;---- 3、ClientSocket1的OnError事件代码如下: 
    procedure TForm1.ClientSocket1Error(Sender: TObject;
    Socket: TCustomWinSocket; ErrorEvent: 
    TErrorEvent;var ErrorCode: Integer);
           begin
    Application.MessageBox(PChar('    不能连接到IP地址
     : ' + Edit2.Text+'。'+
    #13+'可能是监听程序没有运行或网络故障!'),'
    连接错误',MB_OK+MB_ICONSTOP);
              ErrorCode := 0; 
           end;---- 4、Button1的OnClick事件代码如下: 
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    with ClientSocket1 do  begin
    if Active then begin
    Active := False;//在连接之前首先关闭
    ConnectFlag:=False; //置连接标志为假
    end;
    if Length(Edit2.Text) > 0 then begin
    Host := Edit2.Text; //指定IP地址或主机名
    Active := True;     
                end;   
              end;
           end;---- 5、Button2的OnClick事件代码如下: 
    procedure TForm1.Button2Click(Sender: TObject);
           begin
              if ConnectFlag then
    ClientSocket1.Socket.SendText(Edit1.Text)
      //如果连接成功则发送字符串
              else
    Application.MessageBox(PChar('    没有连接到地址 :
     ' + Edit2.Text+'。'+
    #13+'检查IP地址是否存在或是否已经连接!'),'
    提示信息',MB_OK+MB_ICONSTOP);
           end;    三、编写被控程序 
    ---- 1、新建一个项目Server.dpr,并把一个TServerSocket元件放到Form上,它的属性设置如下:Active设为True;Port设为100,其它属性按默认值。 
    ---- 2、ServerSocket1的OnClientRead事件代码如下: procedure TForm1.ServerSocket1ClientRead
    (Sender: TObject;Socket: TCustomWinSocket);
           var
             Str:PChar;
             Code,V:Integer;
           begin
       Str:=PChar(Socket.ReceiveText);  //接收字符串
    Val(Str,V,Code); //处理接收的字符串,首先转换字符串为整数   
      if Code< >0 then  
    Application.MessageBox(Str,'提示信息',
    MB_OK+MB_ICONINFORMATION) 
    //如果转换后的数据不是一个整型数就通过消息框来显示字符串
             else
               if (V=0)or(V=1)or(V=2) then 
                 ExitWindowsEx(V,0) 
    //调用Windows的API函数(V=0表示重新登录、
    V=1表示关机、V=2表示重启动)
               else
    Application.MessageBox(Str,'提示信息',
    MB_OK+MB_ICONINFORMATION); 
    //转换后数据不为0、1、2时在消息框内显示字符串
           end;---- 3、修改项目文件,不让窗口显示并且防止它运行两次,修改begin和end之间的代码如下: 
           begin
    Application.Initialize;
    if FindWindow('TForm1','Form1')=0 then begin 
    //当没有找到Form1时执行下面代码
    Application.ShowMainForm:=False; //不显示主窗口
    Application.CreateForm(TForm1, Form1);
    Application.Run;
              end;
           end.
      

  2.   

    Delphi DEMO下有 例子呀!
      

  3.   

    UPD协议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.
      

  4.   

    client:SendText
    server:ReceiveText