Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi OnRead bei den Indys...? (https://www.delphipraxis.net/97115-onread-bei-den-indys.html)

keksman 5. Aug 2007 00:04


OnRead bei den Indys...?
 
Hallo,

habe gerade für die Experten ein sicherlich leichtes Problem, habe mich bisher kaum mit den Indys auseinandergesetzt. Und zwar möchte ich beim TCP Clienten mitbekommen, ob der TCP Server mir was gesendet hat und umgekehrt. Bei den Sockets gibts da ja OnRead (oder ähnlich...) wie bekomme ich das nun bei den Indys mit?

Verwende Indy9

Gruß
keksman

PigfaceJoe 5. Aug 2007 01:18

Re: OnRead bei den Indys...?
 
Hi!
Obwohl du das mit der Suche auf jeden Fall gefunden hättest erklär ichs hier mal:

Also, du hast 2 Anwendungen einen Server (IdTCPServer) und einen Client(IdTCPClient).

der Server:

1)Neue Anwendung erstellen
2) idTCPServer1 aufs Formular ziehen
3) Button1 mit Caption "Los gehts ;-)" aufs Formular
3) Button2 mit Caption "Und tschüss" aufs Formular

OnClick Ereignis vom Button1:
Delphi-Quellcode:
idTCPServer1.Active:=true;
idTCPServer1.DefaultPort:=80 //irgendeiner, der frei ist...
OnClick Ereignis vom Button2:
Delphi-Quellcode:
idTCPServer1.Active:=false;
Nun klickst du den IdTCPserver1 an und wählst unter "ereignisse" das OnExecute ereignis. (das wird aufgerufen, sobald ein Client den Server anwählt)

Hier steht dann folgendes:
Delphi-Quellcode:
  with AThread.Connection do
  begin
showmessage(ReadLN);
Disconnect;
end;
Alles speichern und weiter gehts

So nun der Client:
Also :
Neue Anwendung
Button1 mit Caption" Senden" aufs Formular
edit1 aufs Formular
IdTCPClient1 aufs Formular.
So, folgendes steht im OnClick vom Button1:
Delphi-Quellcode:
IdTcpClient1.host:=localhost;
IdTcpClient1.Port:=80 ;//der gleiche wie beim server..
IdTCPClient1.Connect;
IdTCPClient1.WriteLn(edit1.text);
IdTCPClient1.Disconnect;
So auch das jetzt speichern und server starten. Dann den Client starten.
Denk dran auf den Button1 vom server zu klicken und schon kanns losgehn!

Ich hoffe ich konnte dir helfen, :bouncing4:
Schönen Gruss
PigfaceJoe

keksman 5. Aug 2007 03:06

Re: OnRead bei den Indys...?
 
Naja es muss ständig abgefragt werden, ob etwas neues empfangen wurde, wie z.B. bei einem Spiel oder Chat.
Ich hab mir die Indy Demos angeschaut, aber da wurde mit Timern gearbeitet, dass kann's ja wohl nicht sein :?

Die Sockets kann man ebenfalls vergessen, die Dinger schaffen es einfach nicht die Daten zu verarbeiten wenn mal ein bisschen mehr gesendet wird.

inherited 5. Aug 2007 09:17

Re: OnRead bei den Indys...?
 
Die Sockets können das, du musst nur drauf achten, dass OnRead immer wenn etwas ankommt aufgerufen wird und eventuell deine nachricht noch garnicht da ist, du könntest zB nach jedem String ein Byte senden, das anzeigt, dass die nachricht zu Ende ist. Die Sockets lösen das mit dem OnRead IMHO mit einem Thread der ständig abfragt ob etwas ankommt, also praktisch auch etwas wie ein "timer"

Benutz einfach mal die Suche, es hatten schon einige weitere Leute das gleiche Problem.

keksman 5. Aug 2007 14:06

Re: OnRead bei den Indys...?
 
Die Sockets sind absoluter Müll, selbst Borland rät von diesen ab. Sende ich alle 10 Sekunden was funktioniert es wunderbar, lass ich den jetzt 10x die Sekunde was senden, passiert irgendwann einfach nichts mehr.

Delphi-Quellcode:
 
TChat = record
  Nick:        String[12];
  Text:        String[255];
end;
Delphi-Quellcode:
 
if Socket.ReceiveLength = SizeOf(Chat) then
begin
  Socket.ReceiveBuf(Chat, SizeOf(Chat));
  Memo1.Lines.Add(
  Chat.Nick + ' sagt: ' +
  Chat.Text
  );
end;
So empfange ich z.B. Daten. Das währe in den Sockets jetzt bei OnRead drin. Sende ich aber jetzt Daten per Timer also z.B. 10x die Sekunde, passiert irgendwann nichts mehr. Ich bin gerade (testweise) dabei einem Singleplayer Spiel einen Multiplayer zu verpassen. Charaktere spawnen und vom Server bewegen lassen klappt wunderbar, nur laggt das irgendwann wenn nur alle 10 Sekunden die Position der Charaktere abgefragt wird. Daher müsste ich die Positionen immer abfragen... die Sockets kann man da vergessen.


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