Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jul 12, 2025 03:09

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Delphi TCP Komponenten
BeitragVerfasst: Fr Nov 10, 2006 13:24 
Offline
DGL Member

Registriert: Di Sep 19, 2006 13:24
Beiträge: 173
Hi,

ich will gerade meinen Pong-Clon onlinefähig machen. Ansich sollte das recht einfach sein, ich werde einen Server und zwei Clients nehmen und alles Serverseitig berechnen lassen ausser die Kollision mit dem eigenem Balken. (Da das der einzige Punkt im Spiel ist an dem man Genauigkeit/Geschwindigkeit) braucht.

Nun mein Problem, ich finde keine gute Beschreibung der Tcp Komponenten... (TCPServer/TCPClient), ich vermute das diese sich mindestens einmal verändert haben seitdem es Delphi gibt da die meisten tutorials im Internet schlicht und einfach nicht bei mir funktionieren da meine Komponenten nicht dieselben Funktionen beinhalten wie die im Internet.

Frage1: Ist es überhaupt möglich den Client zu erreichen ohne den Port freizuschalten? Wenn Nein wie machen das Programme wie Skype usw.?

Frage2: Wie lasse ich den Server antworten? Ich kann ihm Text senden aber das Antworten klappt nicht. (Das wird im NetChat Tutorial von Borland leider nicht gezeigt)

Frage3: Ich habe im Internet gelesen man muss Clientseitig sachen per timer empfangen da es keine entsprechende Funktion im Client gibt, mein TcpClient hat aber eine "OnRecive" Funktion, mit dieser empfange ich die Sachen dann auch oder?

Hoffe ich habe mein Problem verständlich geschildert.

Gruß, gucky


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 10, 2006 13:38 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 03, 2002 15:08
Beiträge: 662
Wohnort: Hamburg
Programmiersprache: Java, C# (,PhP)
Was es da für Delphi gibt weiß ich leider nicht, meine TCP Erfahrungen beschränken sich auf Java.

Zu 1: Wenn der Port dicht ist, ist er dicht und das ankommende Paket landet im Nirvana. Bei Skype und Co muss man diese bzw die Firewall entsprechend konfigurieren. So kenn ich das jedenfalls.

Zu 2: Der Server hat doch sicher auch eine Methode mit dem er Daten verschicken kann, oder? In dem Falle benötigst du "nur" die Adresse des Clients und schickst diesem dann die Daten.

Zu 3: Das sollte auf Serverseite auch mit einem Timer oder THread ablaufen, denn der Client muss/sollte schon horchen ob da Pakete für ihn ankommen. Wie genau diese OnReceive Methode der Komponente arbeitet weiß ich nicht, schätze aber mal das die intern auf dem jeweiligen Port lauscht.

_________________
(\__/)
(='.'=)
(")_(")


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 10, 2006 14:00 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
1. Bei einer Internetverbindung ist es so, dass ein Client sich zu einem Server verbindet und dieser darauf antworten kann. Dazu muss diese nicht extra im Router auf Weiterleitung gestelt werden. Die Weiterleitung bezieht sich nur auf einkommende Verbindungen. Siehe HTTP. Der Browser sagt dem Server gib mir mal und der Server schickt ihm die Webseite zu. Der Client hat keine Restriktionen aber der Server muss erreichbar sein. Bei HTTP ist es dann aber so, dass normalerweise die Verbindung danach geschlossen wird. Das muss aber nicht der Fall sein. ICQ/Skype machen das zum Beispiel nicht.

2-3. Schau dir mal die IndyKomponenten an. Dort hast du ein Connectionobjekt welches Lesen und Schreiben kann. Damit sollte das recht einfach machbar sein. Die Komponenten arbeiten von hause aus im Thread.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 10, 2006 17:55 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
Grundsätzlich kannst du die Ereignisse OnRead bzw OnClientRead verwenden. Das größte Problem ist jedoch dass nicht Garantiert wird, dass etwas was du als ein Paket abschickst auch als ein paket ankommt. Es kommen zwar alle Daten in der richtigen Reihenfolge, es kann jedoch passieren, dass für ein paket OnRead mehrfach aufgerufen wird, oder dass mit einem OnRead mehrere pakete auf einmal verarbeitet werden.
Zudem sind die Komponenten relativ heikel, besonders wenn du mehr als 2 Spieler haben willst.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 10, 2006 22:24 
Offline
DGL Member

Registriert: Di Sep 19, 2006 13:24
Beiträge: 173
Es sollen nur 2 Spieler sein (erstmal jedenfalls)

Vielen Dank für eure Tipps. Mit dem Indy-Tutorial von Borland habe ich eigentlich alles verstanden was ich brauche, allerdings habe ich das Gefühl das es da Probleme gibt wenn ich 2 Clients gleichzeitig verbinde. Ich vermute wenn sie gleichzeitig connecten.

Das habe ich mir aus dem Tutorial zusamengeschnibbelt (ich weiß komplett selber ist besser aber soweit verstehe ich das ganze noch nicht)

Code:
  1.  
  2. procedure TForm1.TCPServerExecute(AThread: TIdPeerThread);
  3. var
  4. [..]
  5.  
  6. begin
  7.   with AThread.Connection do
  8.   begin
  9.     AThread.Synchronize(IncrConnectionCount);  //versteh ich nicht
  10.     [..]  // es wird nen bissen was berechnet
  11.     WriteLn([..]);
  12.       Disconnect;
  13.       AThread.Synchronize(DecrConnectionCount);
  14.     end;
  15. end;
  16.  


Im Client sieht es dann so aus das er im Timer anfragen nach der aktuellen Position startet:

Code:
  1.  
  2. procedure TForm1.Timer1Timer(Sender: TObject);
  3. var
  4.  [..]
  5. begin
  6.   with Client1 do
  7.   begin
  8.   if not Connected then Connect;
  9.  
  10.     while Connected do
  11.     begin
  12.         SResponse := UpperCase(ReadLn);
  13.         [..]  // verarbeiten der Daten
  14.         Disconnect;
  15.       end;
  16.     end;
  17.    end;
  18.  


Sllte ich etwas verändern damit es mit zweien besser funktioniert?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 12, 2006 09:25 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
Bei den Indys musst du extrem aufpassen, weil die multithreaded sind. Deher darfst du vermutlich nur innerhalbder von Thread.synchronize(Func) aufgerufenen Funktion auf Variablen aus dem Hauptthread (sprich fast alle) zugreifen.
Allerdings habe ich keine Erfahrung mit Indys, kann mich also auch irren.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 12, 2006 16:48 
Offline
DGL Member

Registriert: Di Sep 19, 2006 13:24
Beiträge: 173
Ich habe das gefühl du redest gerade über den Teil der Sache den ich nicht verstehe..

Kennt ihr vielleicht ein gut verständliches Tutorial? Oder kann mir jemand so sagen wie ich den code veränder damit es mit 2 Clients keine Probleme mehr gibt?


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 26 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 18 Queries | GZIP : On ]