Wie kann ich mehrere Clients verwalten, die über Sockets mit einem Server verbunden sind?

8

Ich habe eine Android-App, die mehrere Geräte verbinden muss. Ein Gerät sollte als Gruppeninhaber fungieren und allen Clients Anweisungen erteilen, bestimmte Dinge zu tun. Ich denke, es ist vergleichbar mit einem drahtlosen Handheld-Spiel, bei dem ein Spieler der Host ist.

Ich habe ein paar Fragen, also werde ich versuchen, sie knapp zu halten. Selbst eine Antwort auf die erste würde helfen.

Zuerst habe ich erfolgreich einen einzelnen Server und ein einzelnes Client-Telefon mit Sockets gekoppelt. Ich habe dies mit der Wi-Fi Direct-Technologie von Android gemacht ( hier beschrieben ). Das Tutorial ist hilfreich, aber leider nicht sehr gründlich, insbesondere bei der Beschreibung von Eins-zu-Viele-Verbindungen. Sobald eine Peer-Liste gefunden wurde, können Socket-Verbindungen geöffnet werden. Ich konnte zwei Geräte mit einem Thread für den Server verbinden ( Using dieses Beispiel ), so:

%Vor%

Ein Client wird nach einem Tastendruck erstellt (ich denke, ich versuche immer noch, meinen modifizierten Code zu verstehen):

%Vor%

Also nehme ich an, meine erste Frage ist: Wie würde ich mehr Clients erlauben, verbunden zu sein? Mein ServerThread bezieht sich auf eine einzelne Client-Variable oben, so dass ich nicht sehe, wie ich eine variierende Anzahl erlauben würde (meine Anwendung zielt auf 2 bis 10 Benutzer ab) und kenne auch nicht die korrekte Art, zwischen all meinen verschiedenen Clients zu unterscheiden. Meine einzige Vermutung ist, dass ich die eindeutige IP-Adresse jedes Telefons verwenden würde.

Meine zweite Frage lautet: Wenn ich eine Verbindung mit mehreren Clients / Peers hergestellt habe, wie würde ich dann Anweisungen an sie senden und empfangen? Momentan wartet mein einzelner Server auf eine Anweisung und gibt nach Erhalt eine Antwortanweisung aus. Ich brauche es, damit der Server Anweisungen von Anfang an senden kann, die Tastenbetätigungen verwendend, und das Ergebnis davon ist auf den Clientgeräten sichtbar.

Ich hoffe, ich habe alles klar gemacht!

    
Chucky 04.03.2013, 19:39
quelle

2 Antworten

7

Sie müssen für jeden Client einen neuen Thread starten, da die Sockets einen Thread benötigen, damit sie ausgeführt werden können (da sie die meiste Zeit auf Eingaben warten). Dies kann zum Beispiel (auf diese vereinfachte Weise) geschehen:

%Vor%

Wo der ServerThread ungefähr so ​​aussieht:

%Vor%     
ddmps 04.03.2013, 19:57
quelle
2

Ich habe eine Google TV Box. Und ich habe zwei Handys.

Auf der GoogleTV Box betreibe ich einen Server. Der Server hat einen ServerSocket an Port 6001. Auch der Server verfügt über zwei Sockets für zwei Clients

Das erste Gerät verbindet sich mit dem Server und verwendet Socket Nummer eins die Sekunde die andere ....

Ich kann gleichzeitig verschiedene Nachrichten von zwei Geräten an den Google TV Box-Anschluss senden und sie im Fernsehen zeigen.

Ich benutze die folgende Lösung:

FÜR DEN MOBILE CLIENT (2 Geräte)

Erstellen Sie ein neues Android-Projekt mit einer leeren Aktivität und kopieren Sie diesen Code in. Erstellen Sie ein Layout für den Client, das einen Editiertext und eine Schaltfläche enthält. Stellen Sie sicher, INTERNET UND NETZWERKBESTIMMUNGEN IN ANDROIDMANIFEST.XML EINSTELLEN !!! Und editieren Sie serverIpAddress in dieser Datei zu Ihrer serverszugreifbaren IP.

%Vor%

FÜR DEN SERVER (Google TV Box)

Erstellen Sie ein neues Android-Projekt mit leerer Aktivität und kopieren Sie diesen Code in. Erstellen Sie ein Layout mit nur einem Textfeld Stellen Sie sicher, INTERNET UND NETZWERKBESTIMMUNGEN IN ANDROIDMANIFEST.XML zu setzen !!!

%Vor%

... und vom Server wird der Verbindungshandler für Messaging mit Thread benötigt ...

Erstellen Sie eine zusätzliche Klasse im Serverprojekt namens "ConnectionHandler.java" und kopieren Sie diesen Code in. Es behandelt die asynchronen Verbindungen.

%Vor%

Dies ist nicht die schönste Lösung. Mehrere "nicht nette" Kodierungen. System.exit (1) zum Beispiel. Und es hat nur zwei Geräte unterstützt. Aber es funktioniert für mehr als ein Gerät, und ich bin mir ziemlich sicher, dass Sie es für Ihre Zwecke ändern werden. Es basiert auf drei Webquellen und zusätzlichen Versuchen von mir selbst, damit es funktioniert. Es ist nur mein Prototyp ....

Ich kann nicht mit ihnen verbinden :( ... zu weniger Ruf.

Wenn Sie alles erstellen und ausführen, sollte es so aussehen:

Ссылка

    
thesparxinc 05.04.2013 15:40
quelle