呵呵,本人没学过DELPHI,遇到一个要DELPHI解决的文件传输问题,要用到DELPHI的SOCKET。在网上查过很多资料,自己按网上说的做了,但就是TCLIENTSOCKET连接不到TSERVERSOCKET上面,连接需要哪些操作啊,该怎么做啊?请各位高手指教!!

解决方案 »

  1.   

    在网上找资料吗:
    http://www.99v.com.cn/Article/softtech/program/cjj/net/200506/20913.html
      

  2.   

    //算了,给个可运行的例子吧。
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ScktComp, StdCtrls;type
      TFileInfo=record
        FileName:String[128];
        FileSize:Int64;
      end;
      TGetFileBeginEvent=procedure(var FileName:String) of object;
      TGetFileOverEvent=procedure of object;
      TFileServerThread=class(TServerClientThread)
      private
        FOnGetFileBegin: TGetFileBeginEvent;
        FOnGetFileOver: TGetFileOverEvent;
      public
        constructor Create(CreateSuspended: Boolean; ASocket: TServerClientWinSocket;OnGetFileBegin: TGetFileBeginEvent;
        OnGetFileOver: TGetFileOverEvent);
        procedure ClientExecute;override;
      end;
      TForm1 = class(TForm)
        ServerSocket1: TServerSocket;
        ClientSocket1: TClientSocket;
        SaveDialog1: TSaveDialog;
        SendFileBtn: TButton;
        OpenDialog1: TOpenDialog;
        procedure FormCreate(Sender: TObject);
        procedure ServerSocket1GetThread(Sender: TObject;
          ClientSocket: TServerClientWinSocket;
          var SocketThread: TServerClientThread);
        procedure SendFileBtnClick(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        procedure OnGetFile(var FileName:String);
        procedure OnGetFileOver;
      end;var
      Form1: TForm1;implementation{$R *.dfm}{ TFileServerThread }constructor TFileServerThread.Create(CreateSuspended: Boolean;
      ASocket: TServerClientWinSocket;OnGetFileBegin: TGetFileBeginEvent;
        OnGetFileOver: TGetFileOverEvent);
    begin
      inherited Create(True,ASocket);
      Self.FreeOnTerminate:=True;
      FOnGetFileBegin:=OnGetFileBegin;
      FOnGetFileOver:=OnGetFileOver;
      if not CreateSuspended then Resume;
    end;procedure TFileServerThread.ClientExecute;
    var
      Stream:TWinSocketStream;
      FI:TFileInfo;
      FS:TFileStream;
      FileName:String;
      ReadLen:Integer;
      Buffer:String;
    begin
      Stream:=TWinSocketStream.Create(ClientSocket,6000);
      SetLength(Buffer,4096);
      try
        try
          while not Terminated and ClientSocket.Connected do
          begin
            ReadLen:=0;
            while not Terminated and ClientSocket.Connected do
            begin
              Inc(ReadLen,Stream.Read(Pointer(Integer(@FI)+ReadLen)^,SizeOf(FI)-ReadLen));
              if ReadLen=SizeOf(FI) then Break;
            end;
            FileName:=FI.FileName;
            if ReadLen=SizeOf(FI) then
            begin
              if Assigned(FOnGetFileBegin) then FOnGetFileBegin(FileName);
              FS:=TFileStream.Create(FileName,fmCreate);
              try
                while FS.Size<FI.FileSize do
                begin
                  ReadLen:=Stream.Read(Buffer[1],4096);
                  FS.Write(Buffer[1],ReadLen);
                end;
              finally
                FS.Free;
              end;
              if Assigned(FOnGetFileOver) then FOnGetFileOver;
            end;
          end;
        except
          on E:Exception do ClientSocket.Close;
        end;
      finally
        Stream.Free;
      end;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      with ServerSocket1 do
      begin
        ServerType:=stThreadBlocking;
        Port:=1981;
        Active:=True;
      end;
      with ClientSocket1 do
      begin
        ClientType:=ctBlocking;
        Host:='127.0.0.1';
        Port:=1981;
        Active:=True;
      end;
    end;procedure TForm1.OnGetFile(var FileName: String);
    begin
      FileName:='c:\'+FileName;
    end;procedure TForm1.ServerSocket1GetThread(Sender: TObject;
      ClientSocket: TServerClientWinSocket;
      var SocketThread: TServerClientThread);
    begin
      SocketThread:=TFileServerThread.Create(False,ClientSocket,OnGetFile,OnGetFileOver);
    end;procedure TForm1.SendFileBtnClick(Sender: TObject);
    var
      FS:TFileStream;
      FI:TFileInfo;
    begin
      if OpenDialog1.Execute then
      begin
        FS:=TFileStream.Create(OpenDialog1.FileName,fmOpenRead or fmShareDenyNone);
        FI.FileName:=ExtractFileName(OpenDialog1.FileName);
        FI.FileSize:=FS.Size;
        ClientSocket1.Socket.SendBuf(FI,SizeOf(FI));
        ClientSocket1.Socket.SendStream(FS);
      end;
    end;procedure TForm1.OnGetFileOver;
    begin
      ShowMessage('File get over!');
    end;end.