![]() |
[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:
Wo liegt der Fehler?
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; |
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. |
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 ! |
Re: [Indy] TCP Server sendet nicht zum Client
Jupp, es könnte an StringToComponent liegen, denn das hier geht.
Delphi-Quellcode:
Und zwar hervorragend...
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; |
Re: [Indy] TCP Server sendet nicht zum Client
Delphi-Quellcode:
Hier erstmal die StringtoComponent und ComponenttoString Fkt. die mal auch in der Delphi Hilfe findet.
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; 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? |
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:
btw würde ich ReadLn etc. in
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; ![]() |
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? |
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:
|
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:
Habe mich an der Vorlage aus der Code-Library gehalten.
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; |
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 03:42 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