AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Bitmap über Netzwerk verschicken - Aber wie empfangen?
Thema durchsuchen
Ansicht
Themen-Optionen

Bitmap über Netzwerk verschicken - Aber wie empfangen?

Ein Thema von Stanlay Hanks · begonnen am 6. Jul 2003 · letzter Beitrag vom 6. Jul 2003
Antwort Antwort
Benutzerbild von Stanlay Hanks
Stanlay Hanks

Registriert seit: 1. Mär 2003
2.078 Beiträge
 
Delphi 2005 Professional
 
#1

Bitmap über Netzwerk verschicken - Aber wie empfangen?

  Alt 6. Jul 2003, 12:26
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
  Mit Zitat antworten Zitat
Benutzerbild von Stanlay Hanks
Stanlay Hanks

Registriert seit: 1. Mär 2003
2.078 Beiträge
 
Delphi 2005 Professional
 
#2
  Alt 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... :
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#3
  Alt 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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Stanlay Hanks
Stanlay Hanks

Registriert seit: 1. Mär 2003
2.078 Beiträge
 
Delphi 2005 Professional
 
#4
  Alt 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?
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#5
  Alt 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
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Stanlay Hanks
Stanlay Hanks

Registriert seit: 1. Mär 2003
2.078 Beiträge
 
Delphi 2005 Professional
 
#6
  Alt 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"
  Mit Zitat antworten Zitat
Benutzerbild von Stanlay Hanks
Stanlay Hanks

Registriert seit: 1. Mär 2003
2.078 Beiträge
 
Delphi 2005 Professional
 
#7

Re: Bitmap über Netzwerk verschicken - Aber wie empfangen?

  Alt 6. Jul 2003, 20:46
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!
  Mit Zitat antworten Zitat
Marco Haffner
(Gast)

n/a Beiträge
 
#8

Re: Bitmap über Netzwerk verschicken - Aber wie empfangen?

  Alt 6. Jul 2003, 21:11
Noch etwas zu den Komponenten TClientSocket und TServerSocket, ich hatte folgende Einstellungen verwendet:
Port: z.b. 1024
ClientType: ctBlocking
ServerType: stThreadBlocking
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:10 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz