Mam aplikację na Androida, która musi umożliwiać łączenie wielu urządzeń. Jedno urządzenie powinno działać jako właściciel grupy i wydawać instrukcje wszystkim klientom, aby wykonywali określone czynności. Przypuszczam, że jest to porównywalne do bezprzewodowej gry przenośnej, w której jeden gracz jest hostem.Jak obsługiwać wielu klientów podłączonych do serwera za pomocą gniazd?
Mam kilka pytań, więc postaram się je skrócić. Pomogłaby nawet odpowiedź na pierwsze.
Po pierwsze, udało mi się sparować pojedynczy serwer i pojedynczy telefon klienta przy użyciu gniazd. Zrobiłem to za pomocą technologii Wi-Fi Direct Androida (Described here). Samouczek jest pomocny, ale niestety niezbyt dokładny, szczególnie w opisie połączeń jeden-do-wielu. Po znalezieniu listy peerów można otwierać połączenia gniazd. Udało mi się połączyć dwa urządzenia za pomocą nici do serwera (Using this example), tak jak poniżej:
public class ServerThread implements Runnable {
public void run() {
(Code...)
client = serverSocket.accept();
(...other code here.)
}
}
Klient jest tworzony po naciśnięciu przycisku (myślę, wciąż próbuje dostać głowę wokół mojego zmodyfikowanego kodu) :
public class MusicClientThread implements Runnable {
Socket socket = new Socket(serverAddr, port);
while (connected) {
//(Other code here.)
while ((line = in.readLine()) != null) {
//While there are still messages coming
}
}
socket.close();
//(Other code here too.)
}
Przypuszczam, że moje pierwsze pytanie brzmi: w jaki sposób mogę zezwolić na połączenie większej liczby klientów? Moje ServerThread odnosi się do pojedynczej zmiennej klienckiej powyżej, więc nie widzę, w jaki sposób pozwalałbym na zmianę liczby (moja aplikacja ma na celu od 2 do 10 użytkowników) ani nie znam prawidłowego sposobu rozróżniania wszystkich moich różnych klientów. Przypuszczam tylko, że użyłbym unikalnego adresu IP każdego telefonu.
Moje drugie pytanie brzmi: jak już ustanowię połączenie z wieloma klientami/równorzędnymi, w jaki sposób będę wtedy poprawnie wysyłać i odbierać instrukcje? Obecnie mój pojedynczy serwer czeka na instrukcję, a po jej otrzymaniu wydaje instrukcję odpowiedzi. Potrzebuję go, aby serwer mógł wysyłać instrukcje od początku za pomocą naciśnięć przycisków, a ich wynik jest widoczny na urządzeniach klienckich.
Mam nadzieję, że wszystko wyjaśniłem!
Dla każdego nowego klienta, który żąda gniazda z serwera, nie wysyłaj nowego wątku z tym klientem przekazanym do niego.W ten sposób wszystkie dane przychodzące z inputStream tego klienta są wysyłane na serwer – christopher
Musisz rozpocząć nowy wątek za każdym razem, gdy chcesz wykonać żądanie od klienta, nie ma znaczenia, czy już wysłałeś jedna prośba, kiedy wyślesz kolejną, rozpocznie się nowy wątek, który będzie działał symultanicznie. –
Czy więc z perspektywy urządzeń należących do grupy, czy oznacza to, że wątki wielu serwerów działają na tym samym czasie? Jak będę manipulować każdą z nich? – Chucky