![]() |
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:
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?
Image1.Picture.Bitmap.SaveToStream(StreamImage);
ClientSocket1.Socket.SendStream(StreamImage); Danke schon mal. Man liest sich, Stanlay :hi: |
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... : :(
|
Moin Stanlay,
hast Du es auch schon mal im OnClientRead mit TServerSocket.Socket.ReceiveBuf versucht? Gemacht hab' ich das mit TxxxSocket auch noch nicht. |
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? |
Moin Stanlay,
also ich würde es so versuchen:
Delphi-Quellcode:
Ungetestet, ich hab' das hier direkt reingeschrieben.
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; Aber nach diesem Prinzip müsste das eigentlich funktionieren. Wichtig ist hier besonders das [1] bei sBuf, sonst gehen die Daten in's Nirvana ;-) |
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" |
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:
Und beim Client:
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;
Delphi-Quellcode:
Vielen Danke nochmal an Marco! :party:
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. |
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