Hallo allerseits. Ich versuche momentan eine Java-Anwendung zu schreiben. Hierbei sollen zwei Clients eine direkte Verbindung zueinander aufbauen. Ohne einen vermittelnden Server (also per STUN/TURN oder ICE) habe ich keine zuverlässige Lösung finden können. Deshalb möchte ich nun versuchen, einen Server zu programmieren. Dieser soll dabei helfen, die direkte p2p Verbindung zwischen den Clients herzustellen. Nachdem diese Verbindung hergestellt wurde, soll der Server nicht mehr an der Kommunikation beteiligt sein.
Mein Grundgedanken war es nun, dass der Server eine Verbindung zu Client A und Client B herstellen soll. Der Server "verfügt" nun also über zwei Client-Sockets. Nun stellt sich mir die Frage, ob ich diese Client-Sockets bzw. die darin enthaltenen Informationen einfach an den jeweils anderen Client weiterreichen kann. Client A soll also vom Server den Socket von Client B bekommen und umgekehrt.
Mein Gedanken dahinter war nun, dass wegen der vorangegangenen Kommunikation mit dem Server, bereits NAT-Einträge vorhanden sein sollten und nun eine direkte Verbindung zwischen den Clients möglich sein sollte - besonders dann, wenn keine Portweiterleitung aktiviert ist.
Ich meine, dass Webbrowser das auch so machen: Es wird eine Verbindung zu einem Webserver hergestellt. Dabei werden die private IP-Adresse, der lokale Port und der externe Port in einem Eintrag in der NAT-Tabelle miteinander verknüpft. Nur so kann anschließend sichergestellt werden, dass die Antwort des Webservers - die lediglich an eine öffentliche IP-Adresse und einen externen Port geht - an das richtige Gerät innerhalb des Netzwerks weitergeleitet wird.
Übertragen auf mein Programm stellt sich dann quasi die Frage, was passiert, wenn nun nicht der ursprünglich adressierte Webserver antwortet, sondern ein Gerät mit einer ganz anderen Adresse. (Hier vermute ich mein Problem.)
Jetzt zum eigentlichen Problem: Ich habe es ausprobiert und funktioniert - aber nur gelegentlich. Sobald einmal eine Verbindung hergestellt wurde, funktioniert alles problemlos. Ob allerdings überhaupt erst eine Verbindung hergestellt werden kann, hängt davon ab, in welchen Netzwerken sich die Clients befinden. Dabei gilt aber, dass es pro Netzwerk entweder immer funktioniert oder immer nicht funktioniert. Es scheint also kein Zufall zu sein, sondern irgendein Problem, dass ich übersehe.
Ich verzichte an der Stelle mal darauf, Quelltext zu teilen - Die 500 verschiedene Ansätze würden wohl den Rahmen sprengen. Es muss definitiv ein konzeptionelles Problem sein und liegt nicht an einfachen Programmierfehlern.
Nun wäre ich ausgesprochen dankbar, wenn mir jemand dabei behilflich sein könnte, herauszufinden, wo das Problem liegt. Ich würde jeden Input sehr wertschätzen!
Mein Grundgedanken war es nun, dass der Server eine Verbindung zu Client A und Client B herstellen soll. Der Server "verfügt" nun also über zwei Client-Sockets. Nun stellt sich mir die Frage, ob ich diese Client-Sockets bzw. die darin enthaltenen Informationen einfach an den jeweils anderen Client weiterreichen kann. Client A soll also vom Server den Socket von Client B bekommen und umgekehrt.
Mein Gedanken dahinter war nun, dass wegen der vorangegangenen Kommunikation mit dem Server, bereits NAT-Einträge vorhanden sein sollten und nun eine direkte Verbindung zwischen den Clients möglich sein sollte - besonders dann, wenn keine Portweiterleitung aktiviert ist.
Ich meine, dass Webbrowser das auch so machen: Es wird eine Verbindung zu einem Webserver hergestellt. Dabei werden die private IP-Adresse, der lokale Port und der externe Port in einem Eintrag in der NAT-Tabelle miteinander verknüpft. Nur so kann anschließend sichergestellt werden, dass die Antwort des Webservers - die lediglich an eine öffentliche IP-Adresse und einen externen Port geht - an das richtige Gerät innerhalb des Netzwerks weitergeleitet wird.
Übertragen auf mein Programm stellt sich dann quasi die Frage, was passiert, wenn nun nicht der ursprünglich adressierte Webserver antwortet, sondern ein Gerät mit einer ganz anderen Adresse. (Hier vermute ich mein Problem.)
Jetzt zum eigentlichen Problem: Ich habe es ausprobiert und funktioniert - aber nur gelegentlich. Sobald einmal eine Verbindung hergestellt wurde, funktioniert alles problemlos. Ob allerdings überhaupt erst eine Verbindung hergestellt werden kann, hängt davon ab, in welchen Netzwerken sich die Clients befinden. Dabei gilt aber, dass es pro Netzwerk entweder immer funktioniert oder immer nicht funktioniert. Es scheint also kein Zufall zu sein, sondern irgendein Problem, dass ich übersehe.
Ich verzichte an der Stelle mal darauf, Quelltext zu teilen - Die 500 verschiedene Ansätze würden wohl den Rahmen sprengen. Es muss definitiv ein konzeptionelles Problem sein und liegt nicht an einfachen Programmierfehlern.
Nun wäre ich ausgesprochen dankbar, wenn mir jemand dabei behilflich sein könnte, herauszufinden, wo das Problem liegt. Ich würde jeden Input sehr wertschätzen!