Einzelnen Beitrag anzeigen

hardy1234

Registriert seit: 8. Aug 2004
Ort: Hamburg
26 Beiträge
 
Delphi 7 Enterprise
 
#53

Re: Einen Chat mit den Sockets programmieren

  Alt 14. Feb 2005, 04:10
Ganz nett, nur

1. Warum immer die Indy's?
2. Warum das ganze immer mit Timern?

Ich hab das mit den Delphi7-Internetkomponenten realisiert und das vollständig Event-gesteuert und mit Threads veranstaltet. Allerdings ist hierfür ein Proxy-Server zu programmieren, der die Web-IP's der Clients vorhält. Schließlich soll das Ding ja auch im Internet funzen.

Notwendig ist hierfür:

1. Über www.dyndns.org oder www.no-ip.com sich einen Alias-Namen besorgen (kost nix)
2. Der Client muß sowohl eine TcpClient- und TcpServer-Komponente haben.

Nach anfänglichen Problemen mit den Delphi-Komponenten hab ich die Unit kopiert und noch ein paar Änderungen vorgenommen. Z.B. TcpCustomClient.ReadStream. Das funzt prima.
Etwas aufwendig ist die Kiste mit den Threads, das leidige Problem der Online-Hilfe bzw. dem Handbuch ist ja bekannt.

Ist der Server(Client) gestartet horcht der fröhlich am Port auf ankommende Nachrichten und erzeugt sofort einen Thread in dem die Vorverarbeitung stattfindet (eigenes IP-Protokoll nötig).
Damit der Client nun auch seine Web-IP bekommt sendet er eine Anforderung an den Proxy-Server der sofort mit der Web-IP antwortet. Das ganze natürlich verschlüsselt und mit einem Zertifikat versehen. Die Zeitabläufe entsprechen etwa einem normalen Ping, ca. 70-80 ms. Wenn das nix ist?

Der Server hält eine Firebird-Datenbank vor, in der die Web-IP's der Clients gespeichert werden und so für alle Clients mit dem entsprechenden Zertifikat weltweit vorgehalten werden. Sollte der Client zwischendurch seine Web-IP ändern, teilt er das per Thread allen Online-Clients selber mit. Da das über einen Thread läuft merkt der Anwender nichts davon. Das ist gar keine schwierige Übung, man sendet einfach einen Header mit dem entsprechenden Befehl und der Serversocket im empfangend Client hat automatisch die neue IP (Client.LookUpHostAddr(Client.HostName)). Vorbedingung ist lediglich, das der Nickname je Client eineindeutig ist.

Vorteil bei diser Vorgehensweise ist, das der Serversocket im Client nur dann etwas tut wenn er auch Daten empfängt. Ob der Client dann stundenlang nix tut oder nicht ist schißkujennum. Er belastet anders als beim IRC den Server(Proxy) nicht.

Besonders lustig ist bei der ganzen Sache, das die Kiste auch im internen Netzt klappt. Das einzige Problem, das ich noch lösen muß ist die Weiterleitung ins interne Netz wenn der Client von dort gesendet hat und die gemeinsame Web-IP benutzt um einen Client irgendwo auf der Welt zu erreichen.

Wenn jemand Spaß daran hat bei dem Projekt ein bißchen mit zu tun dann bei mir melden. Da ist noch ne Menge Arbeit dran. Das ganze ist auch bezüglich Threads und Netzwerk-Programmierung lehrreich und echt spannend.

Am Besten an der ganzen Sache ist, daß man das Website-Geschisse und den Browser nicht braucht. Das funzt mit nem ganz normalen Programm und damit sicherer und schneller als jedes Script das je könnte.
Es gibt keinen schöneren Tag als den heutigen. Der gestrige ist vorbei und von den kommenden weiß man nicht was sie bringen.
  Mit Zitat antworten Zitat