Witam,
Tworzę aplikację, umożliwiającą komunikację pomiędzy jednym serwerem, a wieloma klientami.
Założenia:
-
Wszyscy klienci widzą to samo, jeżeli jeden z nich zmieni wartość zmiennej x, to pozostali również widzą to w czasie rzeczywistym (za pośrednictwem serwera).
-
Serwer komunikuje się ze wszystkimi klientami jednocześnie, odbierając i wysyłając wartości jakichś zmiennych (typu boolean, int, itp).
-
Grupa klientów, którzy mają prawo połączyć się z serwerem ma być ograniczona, w sensie: nie każdy kto chce może się połączyć, tylko np. z góry ustaleni użytkownicy, lub konkretne urządzenia, np o znanym wcześniej adresie MAC (to byłoby najbezpieczniejsze dla mnie rozwiązanie).
Z czym mam problem:
- Zastanawiam się za pomocą czego najlepiej przesyłać zmienne, myślałem nad stream sockets, bo protokół TCP zapewnia kontrolę kolejności, w jakiej wysłałem komunikaty. I zrobić to jako aplikację wielowątkową (choć nigdy takiej nie robiłem) - to dobry pomysł?
Zastanawiałem się też nad wykorzystaniem Multicast (byłoby wygodnie), tyle że nie wiem, czy jest bezpieczna - mógłby się ktoś wypowiedzieć na ten temat? Czy Multicast pozwala mi wybrać, do których użytkowników chce wysłać dane (w sensie, żeby tych niepożądanych ominąć)? I czy w ogóle to działa ze stream sockets? Bo wydaje mi się, że to jest zabawa z data gram socket, czy nie tak?
Czytałem też coś o możliwości zastosowania XMPP, ale nie mam zielonego pojęcia jak to ugryźć i czy w ogóle jest sens się w to bawić - w końcu to nie ma być komunikator :/
-
Nie wiem w jaki sposób zrealizować przesyłanie danych. To będą przede wszystkim wartości boolowskie, oraz liczbowe. Kiedyś zrobiłem grę w statki, w której wysyłałem zmienne w postaci komunikatów tekstowych (oparłem się na zwykłym komunikatorze internetowym, to było w C++) i serwer odbierając te dane używał specjalnego parsera - ta metoda nie jest ani szybka, ani zgrabna. Jak to powinno wyglądać, tak profesjonalnie?
-
Znalazłem sposób na odczytanie własnego MAC adresu:
try{
InetAddress numerIp;
numerIp = InetAddress.getLocalHost();
NetworkInterface network = NetworkInterface.getByInetAddress(numerIp);
byte[] macAdres = network.getHardwareAddress();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < macAdres.length; i++) {
sb.append(String.format("%02X%s", macAdres[i], (i < macAdres.length - 1) ? "-" : ""));
}
return sb.toString();
}
catch (UnknownHostException e) {
return "UnknownHostException: "+e;
}
catch(SocketException e){
return "SocketException: "+e;
}
Teraz jak odczytać MAC adres klienta, a nie swój? Chciałbym po prostu go sprawdzić, czy to urządzenie faktycznie jest na mojej liście zaufanych użytkowników, jeżeli nie, to nie prześlę mu danych. Czytałem, że najpierw trzeba go spingować, ale nie wiem jak to zrealizować w Javie :/
Jestem początkujący,
z góry dziękuję za pomoc :)