请问,哪有使用D7的TCPSERVER,TCPCLIENT开发通讯程序的资料或范例?
问题2:如何使用D7的TCPSERVER,TCPCLIENT传递文件,请给出具体实现方法?

解决方案 »

  1.   

    Delphi7自带的DEMO里有一个NetChat
      

  2.   

    用D7的TCPSERVER,TCPCLIENT传递文件的例子:unit mainform;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Sockets, ComCtrls;type
      TForm1 = class(TForm)
        TcpClient1: TTcpClient;
        TcpServer1: TTcpServer;
        btnchg: TButton;
        Edit1: TEdit;
        edtRemoteHost: TEdit;
        edtRemotePort: TEdit;
        Label1: TLabel;
        Label2: TLabel;
        Label3: TLabel;
        btnsel: TButton;
        btnsnd: TButton;
        OpenDialog1: TOpenDialog;
        ProgressBar1: TProgressBar;
        SaveDialog1: TSaveDialog;
        procedure btnchgClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure btnselClick(Sender: TObject);
        procedure btnsndClick(Sender: TObject);
        procedure TcpServer1Accept(Sender: TObject;
          ClientSocket: TCustomIpClient);
      private
        { Private declarations }
        sndfilename  :  string;
      public
        { Public declarations }
      end;TClientDataThread = class(TThread)
        buf : array of byte;
        fname : string;
        flength : integer;
        constructor Create(CreateSuspended: Boolean);
        procedure Execute; override;
        procedure acceptfile;
         procedure Terminate;
        end;
    var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.btnchgClick(Sender: TObject);
    begin
      tcpserver1.LocalPort:=edit1.Text;
      //tcpserver1.Listening:=true;   错误:  listening 是只读属性
      tcpserver1.Active:=true;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      sndfilename:='';
      form1.btnchg.Click;
    end;procedure TForm1.btnselClick(Sender: TObject);
    begin
      if opendialog1.Execute then
         sndfilename:=opendialog1.FileName;
    end;procedure TForm1.btnsndClick(Sender: TObject);
    var
         sfile  :  Tfilestream;
         filebuf : array of byte;
         filelength : integer;
    begin
      TcpClient1.RemoteHost := edtRemoteHost.Text;
      TcpClient1.RemotePort := edtRemotePort.Text;
      try
        if TcpClient1.Connect then
           begin
           sfile := tfilestream.Create(sndfilename,fmOpenRead);
           filelength:=sfile.Size ;
           setlength(filebuf,filelength+sizeof(integer));
          
          copymemory(filebuf,@filelength,sizeof(integer));
           sfile.Read(filebuf[sizeof(integer)],filelength);
                sfile.Free;
           tcpclient1.SendBuf(filebuf[0],filelength+sizeof(integer));       end;
      finally
        TcpClient1.Disconnect;  end;
    end;{ TClientDataThread }procedure TClientDataThread.acceptfile;
    var
        fstream : Tfilestream;
    begin
       fstream:=tfilestream.Create(fname,fmcreate);
       fstream.Write(buf[0],flength);
      end;constructor TClientDataThread.Create(CreateSuspended: Boolean);
    begin
      inherited Create(CreateSuspended);
      FreeOnTerminate := true;
    end;procedure TClientDataThread.Execute;
    begin
      Synchronize(acceptfile);
    end;procedure TForm1.TcpServer1Accept(Sender: TObject;
      ClientSocket: TCustomIpClient);
    var
        flen ,rlen,position :  integer;
        recthread : TClientDataThread;
    begin
       if savedialog1.Execute then
             begin
             position:=0;
                     clientsocket.ReceiveBuf(flen,sizeof(integer));
             recthread:=TClientDataThread.Create(true);
             recthread.fname:=savedialog1.FileName;
             recthread.flength:=flen;
             setlength(recthread.buf,flen);
                   rlen:=ClientSocket.ReceiveBuf(recthread.buf[position],flen);
             position:=rlen+position;
             while rlen<flen do
                 begin
                 flen:=flen-rlen;
                 rlen:=clientsocket.ReceiveBuf(recthread.buf[position],flen);
                 position:=rlen+position;
                 end;
             recthread.Resume;
             end;
    end;procedure TClientDataThread.Terminate;
    begin
       inherited;
    end;end.