Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Bitmap über Netzwerk verschicken - Aber wie empfangen? (https://www.delphipraxis.net/6307-bitmap-ueber-netzwerk-verschicken-aber-wie-empfangen.html)

Stanlay Hanks 6. Jul 2003 12:26


Bitmap über Netzwerk verschicken - Aber wie empfangen?
 
Hallo Leute. Ich und das Netzwerk....schlimm is das. Ich hab hier im Forum schon gesucht, aber nix richtiges gefunden.

Also: Ich mächte ein Bitmap über das Netzwerk versenden. Folgenden Code hab ich schon:

Delphi-Quellcode:
Image1.Picture.Bitmap.SaveToStream(StreamImage);
ClientSocket1.Socket.SendStream(StreamImage);
Jetzt hab ich mir gedacht, im ServerSocket1ClientRead Ereignis gäbs dann auch was entsprechendes zum laden dieses Streams...aber ich hab leider nix gefunden. Kann mir wer helfen/sagen/erklähren, wie ich das empfangene Bild im ServerProgramm laden kann?

Danke schon mal. Man liest sich, Stanlay :hi:

Stanlay Hanks 6. Jul 2003 13:20

Hat denn keiner ne Idee? Ich weiß schon, dass ich etwas ungeduldig bin, aber ich sitz hier wie auf Kohlen, weil ich das einfach nicht hinbekomme... : :(

Christian Seehase 6. Jul 2003 13:39

Moin Stanlay,

hast Du es auch schon mal im OnClientRead mit

TServerSocket.Socket.ReceiveBuf

versucht?

Gemacht hab' ich das mit TxxxSocket auch noch nicht.

Stanlay Hanks 6. Jul 2003 13:43

ABer wie kann ich das empfangene (ein Stream) dann als Bild laden?
Ich müsste es ja wieder mit Image1.picture.bitmap.loadfromstream laden.
Weißt du, wie ich machen kann?

Christian Seehase 6. Jul 2003 13:53

Moin Stanlay,

also ich würde es so versuchen:

Delphi-Quellcode:
var
  sBuf : string;
  ms  : TMemoryStream;

begin
  sBuf := StringOfChar(#00,ServerSocket.Socket.ReceivedLength);
  ServerSocket.Socket.ReceiveBuf(sBuf[1],ServerSocket.Socket.ReceivedLength);
  ms  := TMemoryStream.Create;
  try
    ms.Write(sBuf[1],ServerSocket.Socket.ReceivedLength);
    Image1.Picture.Bitmap.LoadFromStream(ms);
  finally
    FreeAndNil(ms);
  end;
end;
Ungetestet, ich hab' das hier direkt reingeschrieben.
Aber nach diesem Prinzip müsste das eigentlich funktionieren.

Wichtig ist hier besonders das [1] bei sBuf, sonst gehen die Daten in's Nirvana ;-)

Stanlay Hanks 6. Jul 2003 14:10

Hallo! Danke schon mal für den Code. Bin überzeugt, dass er funzt. nur komischerweise krieg ich schon beim versenden des Stream eine Fehlermeldung:

Zugriffsverletzung bei Adresse 40032331 in Modul 'rtl70.bpl' Lesen von Adresse 8BD88B6D.

Was soll das jetzt schon wieder.

Wenn ich diesen AusnahmeFehler erhalte, hab ich da was falsch gemacht, oder sind da Dateien "kaputt"

Stanlay Hanks 6. Jul 2003 20:46

Re: Bitmap über Netzwerk verschicken - Aber wie empfangen?
 
Dank der großartigen Hilfe (was heißt Hilfe, Marco hat das allein Gemacht!) gibts jetzt eine Lösung für das Problem:

Beim ServerProgramm:
Delphi-Quellcode:
  TReceiveThread = class(TServerClientThread)
  protected
    procedure Execute; override;
  end;

var
  FormServer: TFormServer;
  WS: TWinSocketStream;

implementation

{$R *.dfm}

procedure TReceiveThread.Execute;
var
  WS: TWinSocketStream;
  MS: TMemoryStream;
  GetSize: Integer;
  Buffer: array[0..8191] of Char;
begin
  MS := TMemoryStream.Create;
  try
    while (not Terminated) and ServerSocket.Connected do
    begin
      WS := TWinSocketStream.Create(ClientSocket, 500);
      try
        if WS.WaitForData(60000) then
        begin
          GetSize := WS.Read(Buffer, SizeOf(Buffer));
          while (GetSize > 0) do
          begin
            MS.Write(Buffer, GetSize);
            GetSize := WS.Read(Buffer, SizeOf(Buffer));
          end;
          MS.Position := 0;

          FormServer.Image.Picture.Bitmap.LoadFromStream(MS);
          Terminate;
        end;
      finally
        WS.Free;
      end;
    end;
  finally
    MS.Free;
  end;
end;

procedure TFormServer.ServerSocketAccept(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Statusbar.SimpleText := 'Verbunden mit: ' + Socket.RemoteAddress;
end;

procedure TFormServer.ServerSocketClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Statusbar.SimpleText := 'Verbindung wurde getrennt';
end;

procedure TFormServer.FormCreate(Sender: TObject);
begin
  SetBounds(10,150,Width,Height);
  ServerSocket.Open;
end;

procedure TFormServer.FormDestroy(Sender: TObject);
begin
  ServerSocket.Close;
end;

procedure TFormServer.ServerSocketGetThread(Sender: TObject;
  ClientSocket: TServerClientWinSocket;
  var SocketThread: TServerClientThread);
begin
  SocketThread := TReceiveThread.Create(False, ClientSocket);
end;
Und beim Client:

Delphi-Quellcode:
procedure TFormClient.EditHostChange(Sender: TObject);
begin
  ButtonSend.Enabled := (EditHost.Text <> '') and FileExists(EditBitmap.Text);
end;

procedure TFormClient.ButtonOpenClick(Sender: TObject);
begin
  with OpenDialog do
  if Execute then
    EditBitmap.Text := FileName;
end;

procedure TFormClient.ButtonSendClick(Sender: TObject);
begin
  ClientSocket.Host :=EditHost.Text;
  ClientSocket.Open;
end;

procedure TFormClient.ClientSocketError(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
  MessageDlg('Fehler beim verbinden mit : ' + EditHost.Text + ' (' + 
    IntToStr(ErrorCode) + ')', mtError, [mbOk], 0);
  ErrorCode := 0;
end;

procedure TFormClient.ClientSocketConnect(Sender: TObject;
  Socket: TCustomWinSocket);
var
  MS: TMemoryStream;
begin
  MS := TMemoryStream.Create;
  try
    MS.LoadFromFile(EditBitmap.Text);
    MS.Position := 0;
    Socket.SendBuf(MS.Memory^, MS.Size);
  finally
    MS.Free;
  end;
  ClientSocket.Close;
end;

procedure TFormClient.FormDestroy(Sender: TObject);
begin
  ClientSocket.Close;
end;

procedure TFormClient.FormCreate(Sender: TObject);
begin
  SetBounds(10,10,Width,Height);
  EditHostChange(Sender);
end;

end.
Vielen Danke nochmal an Marco! :party:

Marco Haffner 6. Jul 2003 21:11

Re: Bitmap über Netzwerk verschicken - Aber wie empfangen?
 
Noch etwas zu den Komponenten TClientSocket und TServerSocket, ich hatte folgende Einstellungen verwendet:
Port: z.b. 1024
ClientType: ctBlocking
ServerType: stThreadBlocking


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:56 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz