# Chat programmieren



## juandeluca (31. Jan 2013)

Hallo!

Ich habe mir zur Aufgabe gemacht, in Java einen Chat zu programmieren.

Hierbei stellt sich bereits die erste Frage: Wie? 

Innerhalb eines Netzwerkes ist es ja einfach, da die Clients sich direkt erreichen können, d.h. Ports öffnen, Port Listener, dann Verbindung zu Port aufbauen und 2 Kanäle (Client1 zu Client2 und Client2 zu Client1) aufbauen.

Wie mache ich das nun aber im Internet. Sagen wir folgendes Beispiel:

ClientA <-> Router <-> Internet <-> Router <-> ClientB

Wie erstelle ich dann die Verbindung? IP-Forwarding ist keine Option, da ich davon ausgehen muss, dass der Client keinen Zugriff auf den Router hat.

Hat jemand Ahnung davon?
Vielen Dank im Voraus für alle Mühen!


----------



## Marcinek (31. Jan 2013)

Über ein RelayServer, wohin sich alle verbinden können.

oder

UDP Holepunching

oder

NAT UpNP


----------



## tröööt (31. Jan 2013)

seid ihr denn alle irgendwie unfähig google oder die sufu zu nutzen ...

dieses thema wurde hier x-mal komplett durchgezogen ...

mögliche optionen :

1) zentraler server im netz
standard server/client architektur ... zentraler server für alle erreichbar verwaltet alle verbindungen und nachrichten ... code gibts dazu hier zu hauf

2) *Port*-Forwarding (was bitte soll IP-Forwarding sein ?)
von dir bereits ausgeschlossen aber nötig für direkte client-to-client verbindung da nur die wenigstens router TCP Hole Punching mit machen ...

3) UDP Hole Punching
würde ich jetzt nicht unbedingt für n chat nehmen ... warum : google nach unterschied zwischen UDP und TCP ... dann kennst du die gründe warum man bei nem chat UDP vermeiden sollte
braucht aber trotzdem vermittlungs-server ... dann kann man gleich 1) nehmen

4) UPnP
es gibt ne standardisierte technik um dem router auch ohne direkten admin-interface zugang zu sagen welche ports wohin umzuleiten sind ...
war aber nur mal ne mode-erscheinung und ist heute in den meisten geräten standard OFF ... auch wenn in der firmware vorhanden

5) TCP Hole Punching
selber kram wie UDP-HP ... wird aber von nur sehr wenigen modellen überhaupt unterstützt ...

6) fertige dinge wie IRC nutzen ...


alle 6 punkte wurden hier mehrfach lang und breit erklärt ... wenn du also zu irgendwas fragen hast nutze die sufu oder google ... weitere fragen in diesem thread würden nur zeigen das du unfähig bist selbst probleme zu lösen und das dir grundlagen-wissen fehlt ... und dann müssen wir uns auch nicht unnötig die mühe machen dir noch mal alles lang und breit zu erklären weil es eh zum scheitern verurteilt ist ...


----------



## Kr0e (31. Jan 2013)

Ich bin jetzt mal so frei und schlage einen garantiert exotischen Tipp vor:

Teredo: IPv6 über IPv4 UDP Tunneling. 

Musste damit neulich ein Programm schreiben und war überrascht WIE problemlos das klappte. Du aktiviert auf deinem Windows Rechner einfach das Teredo Protokoll und losgehts mit normalen Sockets, sprich du kannst auch Java dafür nutzen. Teredo ist ein OS-Level Protokoll von Microsoft, es gibt aber auch für Linux Rechner Alternativen.

Wenns sowieso nur für Windows Rechner ausgelegt ist, definitiv Teredo. Klappt hevoragend und du brauchst dich nicht selbst mit UDP Holepunching (Was im übrigen immer noch einen Bootstrap Server benötigen würde) oder sonstigen Hacks.

Achso, natürlich braucht Teredo auch Bootstrap Server, aber die werden von M$ bereitgestellt und it just works. Natürlich wird auch hier UDP Holepunching als Teil des Verbindungsaufbaus genutzt.


----------



## juandeluca (31. Jan 2013)

Vielen Dank für eure schnellen Antworten! 

Ok, also zähle ich hier 7 vorgeschlagene Methoden:

Mir scheint es ganz so zu sein, als wäre die einzige wirklich verlässliche Methode 1) Relayserver, weil
2) erfordert Konfigurationseinstellungen vom User
3) 4) 5) funktioniert nicht überall (Einstellungsabhängigkeit)
6) IRC ist doch öffentlich, oder? Oder gibt es auch die Möglichkeit sowas privat aufzusetzen? => Sinnvoll?
7) Bisher noch nicht gehört, werd mich mal da hineinlesen.

Wie funktionieren den MSN, GoogleTalk oder Skype?
Klar, der Chat wird wahrscheinlich so ablaufen, dass eine von ClientA eingetippte Nachricht an einen Relayserver gesendet wird und dort auf Abruf des ClientB wartet. Wahrscheinlich in Form von Web Service. Aber was ist nun mit Video- und Soundübertragung? Wenn ClientA sein Video und Sound erst an den Relayserver senden muss und von dort dann an ClientB, dann verlängert sich doch nur unnötig die Latenz zwischen ClientA und ClientB im Vergleich zur direkten Verbindung, oder nicht?
Weiß da jmd. Bescheid?


----------



## Bizarrus (31. Jan 2013)

> Wie funktionieren den MSN, GoogleTalk oder Skype?


Google mal nach XMPP bzw Jabber.

Wäre eine alternative zu IRC


----------



## tröööt (31. Jan 2013)

instant messanger wie eben MSN, Skype, etc verwenden in der regel eine kombination aus den genannten techniken ...

normalerweise wird erstmal versucht zwischen den beteiligten nutzern eine direkte verbindung herzustellen ... dazu werden standards wie UPnP und TCP/UDP Hole Punching verwendet ... gerade real-time dinge wie video-konferenzen und audio-übertragung setzen auf UDP da es hier nicht so tragisch ist wenn mal ein teil der informationen verloren geht ... denn das wird damit in kauf genommen das eben die latenz gering gehalten wird da kein relay-server notwendig ist ...

allerdings sind viele systeme mit "failsafe" mechanismen ausgestattet so das wenn keine direkte verbindung etabliert werden kann halt als letzte möglichkeit doch alles über den server läuft ... was natürlich zu großen latenzen führen kann ...


mal davon abgesehen das UPnP wie schon erwähnt nur mal so ne mode-erscheinung war und jedem recht schnell die sicherheitslücken bewusst wurden ist es heute standardmäßig deaktiviert ...
ich hab erst heute mittag auf n-tv n spezial gesehen in dem ausdrücklich davor gewarnt wurde weil wohl zur zeit wieder verstärkt UPnP-angriffe laufen ...
wer es also noch aktiv hat sollte das schnellstens in seinem router ändern ... alleine schon der eigenen sicherheit zu liebe ...

ansonsten stimmt es schon das viele der genannten möglichkeiten von der verwendeten hardware sowie deren firmware und den einstellungen abhängig sind ... wirklich "sicher" ist es halt eine verbindung nach außen zu einem server aufzubauen ... das funktioniert in der regel eigentlich immer ...

was IRC angeht : niemand hindert dich daran dir eine IRC-server-software zu laden und diese entsprechend einzurichten das diese nur für einen bestimmten personen-kreis zugänglich ist ... und schließlich : so lange du keinem die server-adresse verräts ist es eh sehr unwahrscheinlich das sich jemand nur aus reinem zufall auf diesen verirrt ... denn im gegensatz zu anderen diensten gibt es keine globalen index-listen ...


und allgemein ist deine vorstellung eines chats etwas ... nun sagen wir mal ... ungewöhnlich ...

normalerweise läuft es so ab das sich mehrere clients zu einem server verbinden der diese verbindungen dann in einer liste aktive hält ...
sendet nun ein client eine nachricht an den server so verteilt dieser selbst aktiv die nachricht ... und hält diese nicht vor bis client B mal pollt ... wobei das mit webservices so auch umsetzbar bist .. wenn auch wie gesagt eher ungewöhnlich ...


ich hab mal , da ich selbst eher nur was von gehört anstatt verstanden habe , mich etwas zu Teredo informiert ... scheint wohl was propiertäres von M$ zu sein ... und ne wirklich "anleitung" wie mans zum laufen bekommt hab ich auch nicht gefunden ... allerdings erfordert es wohl auch wieder das aktive eingreifen des users in sein system ...
es scheint wohl ne möglichkeit zu sein mit hilfe von public servern etwas zu nutzen was UDP Hole Punching nahe kommt ... aber darauf verlassen würde ich mich auch nicht ...


es hängt halt auch von der ziel-gruppe ab wie du sowas umsetzt ...
solls wirklich für die breite masse sein ohne das man sich selbst um irgendwas kümmern muss wäre 1) ganz klar die beste wahl ...
gehts dann aber über das einfache "chatten" hinaus muss man sich auch mit den anderen methoden befassen ...



wie gesagt : all das wurde hier bereits lang und breit erklärt ...
ich bitte dich also noch mal selbstständig GooGLe und SuFu zu nutzen um deine eventuell noch offenen fragen erstmal selbst zu versuchen zu klären ...
falls du bei irgendwas dann doch nicht weiter kommen solltest wäre es sehr hilfreich wenn du folgendes beachten würdest :
- wonach hast du gesucht
- was hast du gefunen (link !)
- was genau hast du immer noch nicht verstanden / ist dir unklar

es ist in der programmier-szene nun mal üblich das man von jemanden der ein etwas komplexeres projekt als nur "Hello World!" vor hat auch mal ein bisschen eigeninitiative erwartet ... denn wenn man zeigt das man lieber ohne selbst was zu machen gleich wieder die nächste frage stellt ist das für viele ein zeichen das man echt einfach nur faul ist und keinerlei eigen-willen hat ein problem selbst zu lösen ... und dann haben auch viele einfach keine lust das was schon mehr als hundert mal geschrieben wurde noch ein hundert-und-erstes mal zu wiederholen ...

für konkrete fragen bei konkreten problemen sind wir da und helfen gerne ... aber wir sind keine dauer-band-ansage-schleifen die immer wieder alles wiederholen ... und schon gar nicht für leute die sich nicht mal die mühe machen selbst google zu verwenden


----------



## Kr0e (31. Jan 2013)

Teredo ist eine Systemeinstellung, das stimmt. Aber Programmiersprachen können sowas einstellen  Dann muss der User garnichts davon wissen. Und es gibt wie gesagt dieses Protokoll auch für Linux, muss aber installiert werden. Auch das kann mit einem im Hintergrund laufenden Bashskript erledigt werden.
Aber mal ehrlich, Linux User wollen nicht installen, die wollen dunkle Magie mit ihrer Konsole machen .

Propiertär muss also nicht unbedingt was schlechtes sein und verlassen kannst du dich darauf definitiv. Sehr viel mehr als auf eigene gefrickelte Lösungen. Ich verstehe deine Skepsis, bevor ich damit gearbeitet habe dachte ich uahc erst.. hmm joar... klingt komihsc, muss also komisch sein.

WEnn man mal gezielt sucht, wird klar, dass Microsoft sogar sehr viel in dieser Richtung entwickelt hat, nur die wenigsten kennen das oder nutzen es. Viele der Techniken sind bereits in Windows seid XP integriert und erfordern nur ein paar API calls. 

Ein Beispiel: Peer-2-Peer: Mir fällt grad nicht mehr der Name ein, aber Windows ist seid XP auch Peer2Peer fähig. Sprich intern von Windows gibts Programme und Protokolle die sehr ähnliches erledigen wie eine DHT wie Kademlia um P2P mit Teredo laufen zu lassen. Da kann sich Linux und Konsorten nochmal ne Scheibe von abschneiden


----------



## tröööt (31. Jan 2013)

das das ganze schon mit dem NetPack1 für XP verfügbar war und in Vista und 7 (und ich denke auch mal 8) standardmäßig drin ist hab ich auch gelesen ... aber ich konnte leider nirgends in erfahrung bringen WIE ich denn jetzt meinem Win 7 Ulti x64 sage : nu nutz das bitte mal ...

und ich denke mir mal das selbst WENN es so easy ist es mit sicherheit beim erstmal admin-rechte verlangt ... klar kann man z.b. mit Launch4J einen wraper erstellen der nach admin-rechten fragt und diese dann auch gewährt ... aber mir würde es etwas suspekt rüberkommen wenn eine JAVA-anwendung nach erhöten rechten fragen würde ... (wobei mir das nicht auffallen würde da ich eh als System/Administrator angemeldet bin und nicht als normaler hauptbenutzer) ...

wenn du also ne zuverlässige quelle hast wo für XP, Vista, 7 und evtl auch 8 beschrieben steht wie man das ganze in gang setzt und das dann auch wirklich nur n paar calls sind die man auch mit java absetzen kann ... naja ich würds mir auf jeden fall mal angucken ... und wenn ich was sinnvolles mit auf die reihe bekomme vielleicht sogar auch empfehlen ...

ist halt nur so da es so unbekannt ist erstmal auch infos zu finden etwas schwerer ist ...


----------



## Kr0e (31. Jan 2013)

Z.b.: Teredo aktivieren - Anleitung - Online-Tutorial.de

Im prinzip aktiviert man das ganze über ein paar Konsolenbefehle. Obs Adminrechte bracuht weiß ich grad garnicht. Kann gut sein. Wichtig: Bevor Teredo aktiviert werden kann, muss IPv6 aktivert werden.


----------



## tröööt (31. Jan 2013)

sorry ... aber dieser link ist mehr als nur absoluter bullshit ...



> 1. Schritt:
> Das Kommunikationsprotokoll Teredo dient dem Datenverkehr mit dem Internet.


ah .. schön das mir das als "installations-schritt" erklärt wird ... dachte es wäre ein IPv6-through-IPv4/UDP-Tunnel-Protocol ... man lernt halt nie aus


> 2. Schritt:
> Um das Kommunikationsprotokoll jedoch nutzen zu können, ist die Installation und/oder Aktivierung nötig.


gut ... und ich bekomme das genau WO her und aktiviere es genau WIE noch mal ?
hier fehlen links und weiterführende erklärung


> 3. Schritt:
> Bitte beachten Sie, dass Teredo unter dem Betriebssystem Windows XP zunächst installiert werden muss.


ja sach ma schlafen die denn ... das es evtl noch installiert werden muss wurde schon in "Schritt 2" genannt ... da hätte man auch gleich direkt erwähnen können das dies nur für XP nötig ist ...
überflüssig


> 4. Schritt:
> Die Installation können Sie wie folgt durchführen.[/quote
> HÄ ?=! ich dachte das mache ich gerade ...
> fakt : die ersten 4 "installations-schritte" sind lediglich gliederungspunkte und informationen ...
> ...


----------



## Kr0e (1. Feb 2013)

Jetzt fällt mir wieder das Protokoll ein:
Peer Name Resolution Protocol - Wikipedia, the free encyclopedia
PNRP, so hieß das 


Hier ist noch ein kurzes Video zum dem gesamten Thema:

Using IPv6, Teredo, and PNRP with DameWare Mini Remote Control - YouTube


ansonsten:

Your Freedom - IPv6/Teredo
 IPv6 Teredo Computer Networking Notes


Sry, dass der 1. Link Murks war. Man findet aber wirklich viel und das war einer der ersten Treffer.
Ich hatte damit keine Probleme und PNRP klappt wunderbar, selbst unter Linux. Aber ich gebe zu dass ich Hilfe durch einen Prof hatte der mich da eingewiesen hat...


PS: Du musst solche Techniken ja nicht verwenden, keiner zwingt dich von Udp HP nach Teredo zu wechseln 

Im übrigen meintest du ja wenn UDP HP nicht klappt dann auch nicht Teredo. Das stimmt nicht so ganz. Teredo hat Relay-Server wenn HP fehl schlägt. Klar, dass is dann langsamer, aber Chats dürften damit noch gehen. Ob das ganze dann aber noch sicher ist, wage ich zu bezweifeln. Nachteile gibts aber immer. Davon abgesehen... SSL über UDP ? Viel Spaß...

PSS:

Im allgemeinen bin ich eh kein Freund von HP oder sonstigen Hacks. Ich als Student kann mir noch die Einstellung leisten: "Wer zu dumm ist Ports zu öffnen darf dieses Programm nicht benutzen"  Mir ist klar, dass das aus Sicht einer Firma inakzeptabel ist, aber ich bin ja keine Firma


----------



## tröööt (1. Feb 2013)

sorry ... aber entweder bin ich echt einfach nur zu blöd die einfachsten dinge zu befolgen ... oder meine maschine stellt teredo einfach nicht zur verfügung ...

ich hab das genau so gemacht wie der typ in dem video ... aber wieder passierte genau nichts ... bei show state zeigt er mir nur "dormant" als status an .. egal was ich mache ...

und dabei hab ich ein ganz normales 7 Ulti x64 SP1 ... sollte also alles ok sein ...

und genau das ist es eben nicht ... wesshalb ich sagte : kann man sich genau so wenig drauf verlassen wie auf alles andere ...

und das teredo am ende ein fail-safe hat und bei nicht-erfolg über den server relayed ist mir klar ... sonst wär es ja keine wirkliche weiterentwicklung von UDP HP


----------

