Einzelnen Beitrag anzeigen

Evilboyz

Registriert seit: 14. Jan 2003
78 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#20
  Alt 31. Jan 2003, 09:28
Hi,

ich vermute mal stark, dass Du vergessen hast, den Zeiger des Dateistreams auf die letzte Position zu setzen, dann schreibt er nämlich immer von erster Stelle und kommt nie über 4 KB.

Sender:
Code:
unit Client_Server;

interface

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

type
  TForm1 = class(TForm)
    ServerSocket: TServerSocket;
 [...]
    procedure ConnectClick(Sender: TObject);
    procedure DisconnectClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.ServerSocketClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
     Events.Lines.Add('Client Connectet');
     Clients.Text := IntToStr(StrToInt(Clients.Text)+1);
end;

procedure TForm1.ServerSocketClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
     Events.Lines.Add('Client Disconnected');
     Clients.Text := IntToStr(StrToInt(Clients.Text)-1);
end;

procedure TForm1.ServerSocketClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
  var fsWork : TFileStream;
      sIncome : String;
begin
     // Anfrage von Client annehmen
     sIncome := Socket.ReceiveText;

     if sIncome='GetFile' then begin
          // Datei in Stream laden
          fsWork := TFileStream.Create('datei\bindif.exe', fmOpenRead);
          fsWork.Seek(0, soFromBeginning);
          // Stream als Antwort an Client senden
          if Socket.SendStream(fsWork) then begin
             Events.Lines.Add('Datei wurde erfolgreich an Client übertragen');
          end else
              Events.Lines.Add('Ein Fehler ist aufgetreten, die Datei konnte nicht gesendet werden');
     end
     else begin
          Events.Lines.Add(sIncome);
     end;
end;

procedure TForm1.ConnectClick(Sender: TObject);
begin
     ServerSocket.Port := StrToInt(Port.Text); //Festlegung des Ports
     ServerSocket.active := true; //Aktivierung der ServerSocket
     Events.Lines.Add('Server connected on Port ' + Port.Text);
     PageControl.ActivePage := TabSheet1;
end;

procedure TForm1.DisconnectClick(Sender: TObject);
begin
     ServerSocket.active:=false;
     Events.Lines.Add('Server disconnected');
     Clients.Text := '0';
end;

end.
Empfänger:
Code:
unit Client_Server;

interface

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

type
  TForm1 = class(TForm)
    Eingabe: TEdit;
    Button: TButton;
    ClientSocket1: TClientSocket;
    Eventlog: TGroupBox;
 [...]
TCustomWinSocket);
    procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
      ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    procedure ClientSocket1Connect(Sender: TObject;
      Socket: TCustomWinSocket);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.ButtonClick(Sender: TObject);
begin
     if ClientSocket1.Active then
        ClientSocket1.Socket.SendText(Eingabe.text);
end;

procedure TForm1.ConnectClick(Sender: TObject);
begin
    ClientSocket1.Port := StrToInt(Port.Text); //Festlegung des Ports
    ClientSocket1.Host := Host.Text; //IP des Zielrechners
    ClientSocket1.active := true; //Aufbau der Verbindung

procedure TForm1.DisconnectClick(Sender: TObject);
begin
     ClientSocket1.Active:=false;
     Events.Lines.Add('Disconnected');
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var
  fsData : TFileStream;
  sBuffer : String;
begin
  // FileStream zum Schreiben öffnen
  fsData := TFileStream.Create('datei\bindif.exe',fmOpenWrite);
  sBuffer := StringOfChar(#00,fsData.Size);
  try
      // Dateiinhalt als String empfangen und in Datei schreiben
      sBuffer := Socket.ReceiveText;
      fsData.Seek(0, SoFromEnd);
      fsData.Write(sBuffer[1],Length(sBuffer));
      Events.Lines.Add('Datenblock empfangen');
  finally
      FreeAndNil(fsData);
  end;
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
var
  fsEmpty : TFileStream;
begin
  if FileExists('datei\bindif.exe') then
     DeleteFile('datei\bindif.exe');
  fsEmpty := TFileStream.Create('datei\bindif.exe',fmCreate);
  fsEmpty.Free;
end;

end.
  Mit Zitat antworten Zitat