Einzelnen Beitrag anzeigen

jus

Registriert seit: 22. Jan 2005
343 Beiträge
 
Delphi 2007 Professional
 
#1

Streamdaten mit TTCPBlockSocket.RecvStream von Synapse empfangen

  Alt 20. Nov 2018, 09:45
Hallo,

möchte zwischen 2 Programmen Daten, die als Stream vorliegen, mit der Synapse Komponente austauschen. Ich vermute, dass ich beim Empfang der Daten irgendwas falsch mache. Kann wer mir bitte einen Tipp geben?

Und zwar sende ich die Daten von Programm_A so:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
(Sender: TObject);
var
  fs: TFileStream;
  s: string;
  fsTest: TFileStream;
  Sock:TTCPBlockSocket;
begin
  Sock := TTCPBlockSocket.Create;
  sock.Connect('127.0.0.1', '8008');

  fs := TFileStream.Create('echo.txt', fmOpenRead );
  fs.Seek(0, soBeginning);

  Sock.SendStreamRAW(fs);
  fs.Free;

  Sock.CloseSocket;
  Sock.Free;
end;
Das Empfangen in Programm_B:

Delphi-Quellcode:
unit echo;

interface

uses
  Classes, blcksock, synsock;

type
  TTCPEchoDaemon = class(TThread)
  private
    fSock:TTCPBlockSocket;
  public
    anzahl: Integer;
    Constructor Create;
    Destructor Destroy; override;
    procedure Execute; override;
  end;

  TTCPEchoThrd = class(TThread)
  private
    Sock:TTCPBlockSocket;
    CSock: TSocket;
  public
    Constructor Create (hsock:tSocket);
    procedure Execute; override;
  end;

implementation
uses Windows, SysUtils;

{ TEchoDaemon }

Constructor TTCPEchoDaemon.Create;
begin
  inherited create(false);
  fsock := TTCPBlockSocket.create;
  FreeOnTerminate := true;
end;

Destructor TTCPEchoDaemon.Destroy;
begin
  fSock.free;
end;

procedure TTCPEchoDaemon.Execute;
var
  ClientSock:TSocket;
begin
  fSock.CreateSocket;
// fSock.setLinger(true,10000);
  fSock.bind('0.0.0.0','8008');
  fSock.listen;
  while not Terminated and (fSock.LastError = 0) do
  begin
    if terminated then break;
    if fSock.canread(2000) and not terminated then
    begin
      ClientSock:=fSock.accept;
      if fSock.lastError = 0 then
      begin
        MessageBox(Self.Handle, PChar('Clientanmeldung'), '', MB_OK or MB_ICONINFORMATION);
        TTCPEchoThrd.create(ClientSock);
      end;
      inc(anzahl);
    end;
  end;
end;

{ TEchoThrd }

Constructor TTCPEchoThrd.Create(Hsock:TSocket);
begin
  inherited create(false);
  Csock := Hsock;
  FreeOnTerminate:=true;
end;

procedure TTCPEchoThrd.Execute;
var
  i: Integer;
  fs: TFileStream;
begin
  fs := TFileStream.Create('test.bin',fmCreate );
  sock:=TTCPBlockSocket.create;
  try
    Sock.socket:=CSock;
    sock.GetSins;
    repeat
      if terminated then break;
      if sock.CanRead(200) then
      begin
        i:=sock.WaitingData;
        if i>0 then
        begin
          Sock.RecvStream (fs, 200);
        end
        else if fs.Size>0 then break;
      end;
    until terminated;
  finally
    Sock.Free;
  end;
  fs.Free;
end;

end.
Und zwar bleibt beim Programm_B fs.Size immer 0, sprich der Stream wird irgendwie nicht empfangen.

lg,
jus
  Mit Zitat antworten Zitat