Socket Chat

Ich mach mir gerade Überlegungen wie ich eine Chat App schreiben kann, mit der sich zwei Geräte über Wifi Nachrichten senden können.
UDP Ist nicht erlaubt Wifi Direct ist nicht erlaubt. Sockets und Tcp ist Pflicht.

Wenn zwei Geräte an einem Router hängen. Und Gerät 1 als Host fungiert, kann ich automatisch seine IP von Gerät 2 rausfinden ohne sie manuell einzutippen? Da n-Geräte noch am Router hängen, geht das nicht oder ?

Ziel ist es eine App, auf zwei Smartphones zu inistallieren, wenn beide im selben Netzwerk sind, und beide die App offen haben, soll man sich Nachrichten schicken können.
Mich überfordert folgenes: Als GUI ist es nur erlaubt ein Eingabefeld für die Nachrichten zu haben, einen Button Send, und ein Ausgabefeld für empfangene Nachrichten.

Nehmen wir an der Server wird auf beiden Seiten gestartet mit new SocketServer(8888), was soll man als Host beim new Socket(host,8888) eingeben? Die Ip ist doch immer unterschiedlich.

Prinzipiell hast du mit 255.255.255.255 ja eine IP-Broadcast-Adresse. Problem an deiner Anforderung: TCP ist ein Point-to-Point-Protokoll was einiges an Luxus mit sich bringt, wie garantierte Paketreihenfolge, garantierte Paketzustellung, etc - allerdings erlaubt es dir keinen Broadcast. Das wird also mit TCP alleine nicht funktionieren.

Wenn du partout nichts außer TCP-Sockets verwenden willst, bleibt dir noch die Möglichkeit einen Server inkl. Adressierungsprotokol zur Chat-Room-Verwaltung zu bauen.

Dein Protokoll müsste folgendes handeln:

  • Device meldet sich in Chatroom, Server returniert dann die Liste der anderen Chat-Teilnehmer inkl. lokaler Server-Adresse oder die Bestätigung, dass das neue Device Server ist.
  • Device meldet sich als lokaler Chat-Server (z.B. wenn der alte lokale Server nicht mehr erreichbar ist)
    → Server returniert, Nope, gibt’s schon mit lokaler Addresse bla.bla.bla.bla
    → Server returniert, OK, du bist ab jetzt lokaler Server

Damit die Geräte zueinander finden bzw. ihren Chatroom anhand des Wifi definieren, könntest du z.B. die MAC-Adresse des Routers hashen und verwenden.

Ja, das geht. In dem der Chat-Server in einem bestimmten Intervall per UDP seine Adresse broadcasted. Hier gibt’s ein funktionierendes Code-Snippet.

Oder, wie oben beschrieben, du bastelst dir einen Verwaltungsserver.

Richtig. Je nach Router kann es auch ein anderes Subnetz sein. Deshalb wirst du dir in irgendeiner Form einen Broadcast-Mechanismus überlegen müssen.

Ich habe gerade gesehen das Wifi Direct auch Sockets erlaubt, das wusste ich vorher nicht und habe es deswegen ausgeschlossen. Wie wäre es den ohne Router mit Wifi Direct? Weniger Problematisch?

Ja, das ist weniger problematisch. Damit kannst du ein echtes Peer-To-Peer-Netz aufbauen. Allerdings: Ich hab’ keine Ahnung ob da mehrere Verbindungen gleichzeitig offen gehalten werden können. Sicher ist, dass du nicht zum Router verbunden sein kannst wenn Wifi Direct aktiv ist.

Ja der Router spielt dann auch keine Rolle mehr. Er war nur mittel zum Zweck, wenn es auch ohne geht mache ich es ohne. Ich probiere es gerade mit Wifi Direct.

Und, funktioniert das mit mehr als zwei Geräten?

ja es geht 1:1 und 1:n. Bei 1:n ist der erste eine Art AP für alle anderen und alles läuft über ihn. Beim Disco kann ein anderer “Owner” bestimmt werden, doch das habe ich bis jetzt nicht umsetzen können.