Thema: Delphi [TCP] Bilderstreaming

Einzelnen Beitrag anzeigen

Benutzerbild von Net7
Net7

Registriert seit: 22. Jun 2004
Ort: Lauenburg
161 Beiträge
 
Delphi 7 Professional
 
#6

Re: [TCP] Bilderstreaming

  Alt 7. Mai 2008, 15:45
Hi,

probiere es mal so:

Beispiel

Senden:

Delphi-Quellcode:

 // ...
  FStream := TMemoryStream.Create;
  try
    FBitmap.SaveToStream(FStream);
    Buf := FStream.Memory;
    with ServerSocket1.Socket do
      begin
        for i := 0 to ActiveConnections - 1 do
          begin
            Connections[i].SendText('Daten'
              + IntToStr(FStream.Size));
            Sleep(50);
            Connections[i].SendBuf(Buf^, FStream.Size);
          end; {for i := 0 to ActiveConnections do}
      end; {with ServerSocket1.Socket do}
  finally
    FStream.Free;
  end;
Dabei wird zunächst mit SendText ein Header geschrieben, anschließend wird mit SendBuf das Bild übertragen. Die Anweisung Sleep verhindert, dass der Text und der Anfang der Daten zu einem Paket zusammengefasst werden – dann hätte der Client nämlich Probleme, sie wieder auseinander zu bekommen.


Empfang:
Delphi-Quellcode:
procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var
  a: array array[0..4096] of Byte;
  i: integer;
  s: string string;
begin
  if FDaten = false then
    begin
      s := Socket.ReceiveText;
      if Copy(s, 1, 5) = 'Datenthen
        begin
          Delete(s, 1, 5);
          try
            FSize := StrToInt(s);
            FDaten := true;
            Image1.Picture.Bitmap := nil nil;
            FStream.Clear;
          except
          end;
        end; {if Copy(s, 1, 5) = 'Daten' then}
    end {if FDaten = false then}

  else
    begin
      i := Socket.ReceiveBuf(a, 4096);
      FStream.Write(a, i);
      FPos := FPos + i;
      if FPos >= FSize then
        begin
          FDaten := false;
          FStream.Position := 0;
          FPos := 0;
          Image1.Picture.Bitmap.LoadFromStream(FStream);
        end;
    end; {else FDaten = false then}
Alle eintreffenden Daten werden nach FStream geschrieben. Sobald FPos gleich FSize ist, sind alle Daten eingetroffen. FDaten wird wieder auf false gesetzt und das
Bitmap aus dem Stream nach Image1 geladen.


Mfg Net7
Marko
So`ne Atombombe kann einem den ganzen Tag verderben!
Eine eigene DLL in C++ geschrieben wird meist ein Sklave für mein Delphi/Pascal.
  Mit Zitat antworten Zitat