10 sierpnia 2011

Java Socket Server – XSocket

by Biggi — Categories: JavaLeave a comment

Zastanawialiście się kiedyś jakby to było stworzyć własny serwer z którym będą się łączyły inne komputery? Pewnie nie bardzo, ale pomyślcie ile nowych możliwości przynosi taka umiejętność!

Kto wie, może dzięki podstawom które tu poznacie będziecie w przyszłości twórcami nowego dominującego komunikatora lub jakiejś innowacyjnej gry sieciowej?

To co wam tutaj pokażę zapewne nie wystarczy do stworzenia czegoś takiego, ale może być dobrym początkiem, tak zwanym impulsem.

Połączenia na socket’ach możemy robi za pomocą standardowych klas w bibliotekach Java. Jednak udało mi się znaleźć dość ciekawą bibliotekę, która w znaczący sposób ułatwia nam proces budowy aplikacji serwerowej i klienckiej. Jest to xSocket. Cały projekt jest na licencji GNU, a więcej informacji o nim można uzyskać pod adresem http://sourceforge.net/projects/xsocket/, stąd można też ściągnąć najaktualniejszą wersję biblioteki.

Zacznijmy od początku, stwórzmy klasę główną naszego serwera. Ja sobie stworzyłem TestServer.java

public class TestServer {
    public static void main(String[] args) {

    }
}

Aby możliwe było postawienie serwera biblioteka wymaga od nas aby nasza klasa implementowała odpowiedni interfejs. Chodzi tu o IDataHandler, który wymusza na nas zaimplementowanie metody onData, która otrzymuje jako argument INonBlockingConnection. Wygląda to mniej więcej tak.

public class TestServer implements IDataHandler {
    public static void main(String[] args) {

    }

    @Override
    public boolean onData(INonBlockingConnection nbc){

    }
}

Metoda onData jest wywoływana za każdym razem jak serwer otrzymuje jakieś dane. Dane te możemy oczywiście tu odczytać, a nawet możemy od razu stąd wysłać odpowiedź do nadawcy.

Jak to zrobić? Sposób jest nad wyraz prosty. Przy wykorzystaniu tajemniczego obiektu INonBlockingConnection.

public boolean onData(INonBlockingConnection nbc){
    try
    {
        String data = nbc.readStringByDelimiter("\0");
        System.out.println("INCOMING: " + data);
        String result = "Data accepted";
        nbc.write(result + "\0");
        System.out.println("OUTCOMING: " + result);
    }
    catch(Exception e)
    {
        System.out.println(e.getMessage());
    }
    return true;
}

Jak łatwo się domyślić, data zawiera cały pakiet który został do serwera wysłany. Podany string „/0″ jest znakiem który kończy pojedynczy pakiet danych. Przy wysyłaniu pakietów również musimy umieszczać ten znak na końcu, ponieważ dopiero gdy on dotrze do odbiorcy, ten jest powiadamiany o przyjściu wiadomości.

I w tej samej metodzie od razu wysyłam odpowiedź do nadawcy za pomocą nbc.write(). Widać tutaj dokładnie że również dodaję znak „/0″ na końcu.

Wszystkie działania na INonBlockingConnection są dość delikatne, tak jak same połączenia i narażone są na różnego rodzaju błędy i wyjątki, dlatego trzeba je umieszczać w try-catch.

Dobrze, mamy przygotowaną klasę serwerową, jednakże nie zadziała ona, ponieważ nie mamy nic umieszczone w metodzie main. Dzięki dobrze przygotowanemu xSocket do uruchomienia serwera wymaga 2 kluczowych linijek.

    public static IServer server;
    private static int port = 6969;

    public static void main(String[] args) {
        try {
            server = new Server(port, new TestServer());
            server.start();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

Tworzymy nową instancję serwera podając mu port na którym ma on nasłuchiwać oraz obiekt, który ma obsługiwać zdarzenia serwerowe, czyli nasz obiekt TestServer. Potem startujemy serwer.

I już! Nasz serwer działa i oczekuje na pakiety które mogą do niego przyjść. A gdy już przyjdą, to automatycznie odpowiada na wszystkie.

Przedstawiona tu mechanika nie jest zbyt skomplikowana, jeśli nie brać pod uwagę tego, co tu się dzieje pod maską biblioteki xSocket, ale daje już na prawdę spore możliwości jeżeli chodzi o zastosowania serwerowe.

Dość ważną sprawą może być również kontrola nie tylko nad pakietami które do nas przychodzą. W bardzo łatwy sposób można również zarządzać przychodzącymi połączeniami i odłączeniami od naszego serwera. Daje to jeszcze większe możliwości.

Teraz pokażę krótko jak to można zrobić.
Dodajemy kolejne, niezbędne do tego interfejsy.

public class TestServer implements IDataHandler, IConnectHandler, IDisconnectHandler {
   ...
}

Interfejsy te wymagają umieszczenia 2 kolejnych metod w naszej klasie.
Potrzebujemy onConnect oraz onDisconnect.

    @Override
    public boolean onConnect(INonBlockingConnection nbc) throws IOException, BufferUnderflowException, MaxReadSizeExceededException
    {
        try
        {
            System.out.println("connect host from ip: " + nbc.getRemoteAddress());
        }
        catch(Exception ex)
        {
            System.out.println("onConnect: " + ex.getMessage());
        }

        return true;
    }

    @Override
    public boolean onDisconnect(INonBlockingConnection nbc) throws IOException
    {
        try
        {
            System.out.println("disconnect host: " + nbc);
        }
        catch(Exception ex)
        {
            System.out.println("onDisconnect: " + ex.getMessage());
        }

        return true;
    }

Tutaj nie ma wiele do opisywania, ponieważ zasada jest identyczna jak w metodzie onData.

Teraz spokojnie dzięki informacjom które tu zawarłem jesteśmy w stanie napisać czat, czy prymitywny komunikator.

Z kolejnym wpisie postaram się umieścić opis jak napisać klienta który z naszym serwerem będzie w stanie się połączyć.

Pozdrawiam.

17 września 2010

Mafia 2 rekord Guinessa

by Biggi — Categories: Gry, Xbox 360Leave a comment

Właśnie mafia nieoficjalnie została okrzyknięta rekordzistą, który zasługuje na wpis w księdze rekordów Guinessa. W czym ten rekord się objawia?

Dokładnie rzecz ujmując w ilości wypowiedzianych przekleństw. A głównie na jednym słowie na 4 litery i nie chodzi o tylną część ciała.

Niżej zamieszczam filmik, który udowadnia, iż w grze dane słowo pada 200 razy.
No grunt to dobry klimat :)



15 września 2010

Siemanko

by Biggi — Categories: OgólneLeave a comment

Cześć, po raz kolejny staram się wystartować z własnym blogiem.
Ostatnia próba mi nie wypaliła, ponieważ moje zasoby czasowe nie pozwalały mi siadać i pisać.

Teraz moja sytuacja się mocno zmienia i mam nadzieję, że uda mi się odnajdować czas na pisanie tu. A jest to spowodowane przeprowadzką do 3miasta i tym, że będę tam sam.

Chce na tym blogu opisywać głównie moje problemy i sposoby ich rozwiązywania, pomysły, spostrzeżenia i inne ciekawostki. Jak to na blogu o programowaniu się powinno.



Tak na rozluźnienie chciałbym zapodać kawałek, który utkwił mi w pamięci z wyjazdu wakacyjnego. Gdy właściciele małej restauracji w Łebie puścili go, o mało nie udławiłem się pizzą, która im już niestety nie wyszła tak jak powinna.




Pozdrawiam :)

© 2012 Biggi All rights reserved - Wallow theme v0.46.4 by ([][]) TwoBeers - Powered by WordPress - Have fun!