Announcement

Collapse
No announcement yet.

Dateien vom Client zum Server

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Dateien vom Client zum Server

    Hallo,<br>mit den hier gefundenen Beispielen zum TWinSocketStream habe ich prima Dateien vom Client zum Server senden können. Was muß ich aber machen, wenn ich über eine blockierende Verbindung eine Datei vom Server zum Client schieben will. Das soll ungefähr so laufen: Der Client sendet dem Server bestimmte ID und einen Dateinamen. Über die ID weiss der Server, dass er eine Datei zum Client senden soll und über den Dateinamen weiss er dann auch welche Datei.<br>:-) Jens Schumann

  • #2
    Hallo,

    das Schöne an Client/Server liegt ja darin, dass Server und Client beliebig austauschbar sind. Ich würde daher folgendes machen:

    a) "Server" <br>
    Verwendet eine <b>TServerSocket</b>-Instanz, um die Datei-Anforderungen des Clients zu erkennen. Anschließend wird eine <b>TClientSocket</b>-Instanz verwendet, um diesen Dateiinhalt zum Client zu schicken.

    <pre>
    unit TestSrvFrm;

    interface

    uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    ComCtrls, StdCtrls, ScktComp;

    type
    TForm1 = class(TForm)
    StatusBarSrv: TStatusBar;
    MemoSrvLog: TMemo;
    ServerSocket1: TServerSocket;
    ClientSocket1: TClientSocket;
    procedure ServerSocket1ClientRead(Sender: TObject;
    Socket: TCustomWinSocket);
    private
    { Private-Deklarationen }
    FFileName: String;
    procedure DoSendData;
    public
    { Public-Deklarationen }
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.DFM}

    procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
    Socket: TCustomWinSocket);
    begin
    FFileName := Socket.ReceiveText;
    StatusBarSrv.SimpleText := FFileName;
    MemoSrvLog.Lines.Add('OnRead -> Dateinamen erhalten');
    DoSendData;
    end;

    procedure TForm1.DoSendData;
    var
    aWSS : TWinSocketStream;
    aFS : TFileStream;
    begin
    ClientSocket1.Open;
    aWSS := TWinSocketStream.Create(ClientSocket1.Socket, 60000);
    aFS := TFileStream.Create(FFileName, fmShareDenyWrite);
    try
    aWSS.CopyFrom(aFS, 0);
    finally
    aWSS.Free;
    aFS.Free;
    ClientSocket1.Close;
    end;
    MemoSrvLog.Lines.Add(Format('Datei »%s« wurde übertragen.',
    [FFileName]));
    end;

    end.
    </pre>
    &#10

    Comment


    • #3
      b) "Client" <br>
      Verwendet eine <b>TClientSocket</b>-Instanz, um den Dateinamen zum Server zu schicken. Gleichzeitig implementiert der Cleint die <b>TServerSocket</b>-Instanz, um den übertragenen Dateiinhalt zu empfangen und abzuspeichern.

      <pre>
      unit TestCltFrm;

      interface

      uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ComCtrls, StdCtrls, ScktComp;

      type
      TFormClient = class(TForm)
      StatusBar1: TStatusBar;
      Label1: TLabel;
      EditFilename: TEdit;
      ButtonGet: TButton;
      ClientSocket1: TClientSocket;
      ServerSocket1: TServerSocket;
      MemoCltLog: TMemo;
      procedure ButtonGetClick(Sender: TObject);
      procedure ClientSocket1Connect(Sender: TObject;
      Socket: TCustomWinSocket);
      procedure ServerSocket1GetThread(Sender: TObject;
      ClientSocket: TServerClientWinSocket;
      var SocketThread: TServerClientThread);
      procedure ServerSocket1ClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
      procedure ServerSocket1ClientDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
      private
      { Private-Deklarationen }
      public
      { Public-Deklarationen }
      end;

      TClientThread = Class(TServerClientThread)
      public
      procedure ClientExecute; override;
      end;

      var
      FormClient: TFormClient;

      implementation

      {$R *.DFM}

      { TClientThread }

      procedure TClientThread.ClientExecute;
      var
      sFileName : String;
      szBuffer : array[0..1024] of Char;
      aWSStream : TWinSocketStream;
      iBytes : Integer;
      aFStream : TFileStream;
      begin
      FillChar(szBuffer, SizeOf(szBuffer), #0);
      while not Terminated and ClientSocket.Connected do
      begin
      try
      sFileName := FormClient.EditFilename.Text + '_Neu';
      // Blockierende Sockets mit 60 Sekunden Timeout
      aWSStream := TWinSocketStream.Create(ClientSocket, 60000);
      aFStream := TFileStream.Create(sFileName, fmCreate);
      try
      // Client muss innerhalb von 5 Sekunden mit der Übertragung beginnen
      if aWSStream.WaitForData(5000) then
      repeat
      iBytes := aWSStream.Read(szBuffer, SizeOf(szBuffer));
      if iBytes = 0 then
      // Fehlschlag -> Socket-Verbindung schliessen
      ClientSocket.Close
      else
      aFStream.WriteBuffer(szBuffer, iBytes);
      until not aWSStream.WaitForData(2000);
      finally
      aWSStream.Free;
      ClientSocket.Close;
      aFStream.Free;
      end;
      except
      end;
      end;
      end;

      procedure TFormClient.ButtonGetClick(Sender: TObject);
      begin
      ClientSocket1.Active := True;
      end;

      procedure TFormClient.ClientSocket1Connect(Sender: TObject;
      Socket: TCustomWinSocket);
      begin
      Socket.SendText(EditFilename.Text);
      ClientSocket1.Active := False;
      end;

      procedure TFormClient.ServerSocket1GetThread(Sender: TObject;
      ClientSocket: TServerClientWinSocket;
      var SocketThread: TServerClientThread);
      begin
      MemoCltLog.Lines.Add('OnGetThread');
      SocketThread := TClientThread.Create(False, ClientSocket);
      end;

      procedure TFormClient.ServerSocket1ClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
      begin
      MemoCltLog.Lines.Add('OnClientConnect');
      end;

      procedure TFormClient.ServerSocket1ClientDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
      begin
      MemoCltLog.Lines.Add('OnClientDisconnect');
      end;

      end.
      </pre&gt

      Comment


      • #4
        Hallo Herr Kosch,<br><b>vielen vielen Dank</b>,<br>
        :-) Jens Schuman

        Comment


        • #5
          Hallo,

          entweder sehe ich den Wald vor lauter Bäumen nicht,
          oder ich mache grundsätzlich was falsch! Ich möchte
          nichts anderes, als eine Datei, die ich per Dialog
          auswähle, mittels ClientSocket zu einer ServerSocket
          schicken. Ich habe das Beispiel ausprobiert, nur kommt
          am Server - außer der Text (Datei-Name und Pfad) nichts
          an.

          Hat jemand ein Beispiel parrat, dass man als Muster über-
          nehmen kann?

          Mich würde vor allen Interessieren, wie ich auf der Server-
          seite, die Daten (Textfile) weiterverarbeiten kann z.B. in
          einem Memofeld oder einer Listbox.

          Vielen Dan

          Comment


          • #6
            Hallo,

            hat nun doch geklappt. Danke für die Unterstützun

            Comment

            Working...
            X