Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi [Indy] TCP Server sendet nicht zum Client (https://www.delphipraxis.net/27415-%5Bindy%5D-tcp-server-sendet-nicht-zum-client.html)

Delphi Nub 9. Aug 2004 19:34


[Indy] TCP Server sendet nicht zum Client
 
Hiho

habe folgendes Problem: Ich kann via Wirteln von Clienten an den Server einen String schicken aber mit dem selben Befehl nicht von Server zum Clienten. Warum nicht?

Delphi-Quellcode:
procedure TForm1.IdTCPServer2Execute(AThread: TIdPeerThread);
var s:string;
begin
with Athread.Connection do
begin
s:=readln; //das klappt
s:=uppercase(s);
if s='UPDATE' then
Writeln(ComponentToString(Listview2)); //das aber nicht mehr
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
with IdTCPClient2 do
begin
  writeln('Update'); //das klappt auch
  Try
    Listview2.Create(StringToComponent(readln)); // Dies wieder nicht
   finally
    Disconnect
    end;
end;
end;
Wo liegt der Fehler?

GuybrushThreepwood 9. Aug 2004 22:25

Re: [Indy] TCP Server sendet nicht zum Client
 
1. Ich will ja nicht nerven, aber ich wollte mal fragen, wozu das StringToComponent und ComponentToString ist... Denn ich bin Anfänger und blicke da voll nicht durch.

2. Was willst du Senden ??? Die Einträge ???

Danke im voraus.

DataCool 9. Aug 2004 22:55

Re: [Indy] TCP Server sendet nicht zum Client
 
ich denke das der Fehler bei ComponentToString liegt.
Versuch mal als Server Antwort nen einfachen String zum client schickst.
Das geht bestimmt !

GuybrushThreepwood 9. Aug 2004 23:21

Re: [Indy] TCP Server sendet nicht zum Client
 
Jupp, es könnte an StringToComponent liegen, denn das hier geht.

Delphi-Quellcode:
procedure TForm1.IdTCPClient1Connected(Sender: TObject);
begin
  ShowMessage(IdTCPClient1.ReadLn('', 10000, 512));
  IdTCPClient1.Disconnect;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  IdTCPClient1.Connect(10000);
end;

procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
begin
  AThread.Connection.WriteLn('Kuckuck...');
end;
Und zwar hervorragend...

Delphi Nub 10. Aug 2004 07:55

Re: [Indy] TCP Server sendet nicht zum Client
 
Delphi-Quellcode:
function ComponentToString(Component: TComponent): string;

var
  BinStream:TMemoryStream;
  StrStream: TStringStream;
  s: string;
begin
  BinStream := TMemoryStream.Create;
  try
    StrStream := TStringStream.Create(s);
    try
      BinStream.WriteComponent(Component);
      BinStream.Seek(0, soFromBeginning);
      ObjectBinaryToText(BinStream, StrStream);
      StrStream.Seek(0, soFromBeginning);
      Result:= StrStream.DataString;
    finally
      StrStream.Free;

    end;
  finally
    BinStream.Free
  end;
end;

function StringToComponent(Value: string): TComponent;
var
  StrStream:TStringStream;
  BinStream: TMemoryStream;
begin
  StrStream := TStringStream.Create(Value);
  try
    BinStream := TMemoryStream.Create;
    try
      ObjectTextToBinary(StrStream, BinStream);
      BinStream.Seek(0, soFromBeginning);
      Result := BinStream.ReadComponent(nil);

    finally
      BinStream.Free;
    end;
  finally
    StrStream.Free;
  end;
end;
Hier erstmal die StringtoComponent und ComponenttoString Fkt. die mal auch in der Delphi Hilfe findet.

Dann ergeibt sich gleich die nächste Frage: Wie sende eine ganze Componente oder einen Teil dieser Componente auf Anfrage des Clienten von Server an diesen Clienten?

Basic-Master 10. Aug 2004 09:12

Re: [Indy] TCP Server sendet nicht zum Client
 
okay, der code hier is vielleicht net gerade der beste, sollte aber funktionieren (indy 10):
Delphi-Quellcode:
uses ..., IdContext, ...


procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var eCommand:String;
    eList:TStringList;
begin
repeat
  try
    eCommand := AContext.Connection.Socket.ReadLn;
    eCommand := UpperCase(eCommand);
    if eCommand = 'UPDATE' then begin
      eList := TStringList.Create;
      eList.Text := ComponentToString(Self); //hier dann z.b. ListView1
      AContext.Connection.Socket.Write(eList, True);
      eList.Free;
    end;
  except
    //mach was beim fehler
  end;
until (Application.Terminated) or (not AContext.Connection.Connected);
end;

procedure TForm1.IdTCPClient1Connected(Sender: TObject);
var eList:TStringList;
begin
IdTCPClient1.Socket.WriteLn('UPDATE');
eList := TStringList.Create;
IdTCPClient1.Socket.ReadStrings(eList);
showmessage(eList.Text);
eList.Free;
end;
btw würde ich ReadLn etc. in Hier im Forum suchenthreads auslagern...

Delphi Nub 10. Aug 2004 14:14

Re: [Indy] TCP Server sendet nicht zum Client
 
@ Basic-Master
Danke für deine Mühe. Habe leider nur Indy9. D.h. der Code läuft bei mir nicht. Kann man mein Problem nicht auch mit der 9'er Version lösen oder muss ich mir die 10'er Beta installieren?

Basic-Master 10. Aug 2004 19:16

Re: [Indy] TCP Server sendet nicht zum Client
 
hmm der code sollte net schwer zu converten sein.. lass die unit IdContext in den uses weg und ersetz mal alle AContext durch AThread in meinem OnExecute-Event.. sollte funzen, bin mir aber net sicher :stupid:

Delphi Nub 11. Aug 2004 08:43

Re: [Indy] TCP Server sendet nicht zum Client
 
Schade alles schon gemacht. Nach den Convertieren gibts den gleichen Fehler wie vorher. Programm läuft fest. Rien ne va plus = Nichts geht mehr.

Habe mir schon überlegt die Compunente in einen Stream zu packen und dann zu versenden hat aber auch nicht geklappt. Liegt vielleicht auch an mir, denn bei Senden und Empfangen von Stream's blicke ich noch nicht so durch.

Hier der StreamVersuch (läuft auch nicht)

Delphi-Quellcode:
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var s:string; MS:tstream;
begin
with Athread.Connection do
begin
  s:=readln;
  s:=uppercase(s);
  if s='UPDATE' then
   begin
    try
      ms:=tmemorystream.Create;
      ms.WriteComponent(listview2);
      OpenWriteBuffer;
       try
        WriteStream(ms, true, true, 0);
        CloseWriteBuffer;
      except
        CancelWriteBuffer;
        raise;
      end;
    finally
      ms.Free;
    end;
  end;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  ms: TStream;
  SizeOfIncomingStream: integer;
begin
  ms:=Tmemorystream.Create;
  with IdTCPClient1 do
   begin
    connect;
    writeln('Update');
     try
      SizeOfIncomingStream := ReadInteger;
      ReadStream(ms, SizeOfIncomingStream);
     finally
      Disconnect;
      ms.ReadComponent(listview1); //Bin mir nicht ganz sicht ob dies richtig ist?!
      ms.Free;
    end;
   end;
end;
Habe mich an der Vorlage aus der Code-Library gehalten.

freak4fun 12. Okt 2004 15:03

Re: [Indy] TCP Server sendet nicht zum Client
 
hallo,

du kannst Athread nur einmal auslesen

alternative Athread in einer variable speichern

[Edit]Ich sollt die Beiträge vor Erstellen einer Antwort lesen

mfg
freak

:coder: + :gruebel: = :wall:


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:18 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