Aplikacja typu klient-serwer (Android + linux)

0

Cześć,

tworzę aplikację typu klient-serwer. Serwer działa na linuxie i napisany jest w Pythonie, zatem wysyłam Stringi w formacie JSON. Klient (Android) ma za zadanie wysyłać dane do serwera, a serwer odpowiadać, w obu przypadkach ma istnieć nieskończona pętla podtrzymująca komunikację. Tak też działa.

Posiadam taki prototyp klasy wątku:

 class ClientThread extends Thread{

    public Socket socket;
    /* ... */
    public PrintWriter writer;
    public BufferedReader reader;

    private Handler handler = new Handler();

    public ClientThread(String _serverIP, int _serverPort) throws IOException {
       /* inicjacja */
    }

    public boolean sendMessage(String message)  {
       /* wyślij */
    }

    public JSONObject receiveMessage() {
        /* odbierz */
    }


    public void run() {
        try {
            /* ... */

            socket = new Socket(serverAddr, this.serverPort);

            writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
            reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            /* ... */
            
            sendMessage(clientCommand.readyMessage());
            Log.d("ClientLog", "C: Ready sent");

            if (receiveMessage().getBoolean("welcomeMessage")) {
                /* odbierz wiadomosc powitalną */

                sendMessage(clientCommand.welcomeSuccess());

            }

            connected = true;
            while (connected) {
                try {

                    Log.d("ClientLog", "C: Receiving message");
                    receiveMessage();
                    Log.d("ClientLog", "C: Received, sleep 1000ms");

                    if (this.message.getInt("commandId") == 11) { //ack
			/* rozczytanie polecenia */
			SystemClock.sleep(1000);

                   	 Log.d("ClientLog", "C: Sending command.");
                    	sendMessage(clientCommand.ackMessage(new Date()));
                    	Log.d("ClientLog", "C: Sent.");	
                    } else if (this.message.getInt("commandId") == 13) { //mode
			
                    }

                    
                } catch (Exception e) {
                    Log.e("ClientLog", "S: Error inn main loop", e);
                }
            }
            socket.close();
            Log.d("ClientLog", "C: Closed.");
            
        } 
    }

}

Wątek ten tworzę w StartActivity (tam podaję adres i port):

 this.clientThread = new ClientThread(ipAddress, port);
            this.clientThread.start();

Tutaj chciałbym, aby uruchamiany wątek po pomyślnym starcie przechodził do właściwego Activity np: MainActivity.java, gdzie znajdują się np: buttony po których kliknięciu miałaby zostać wysłana konkretna komenda do serwera. Próbowałem przekazać instancję "this.clientThread" poprzez intent do nowej Activity (stosując Parcerable), ale doczytałem, że nie jest to do końca właściwy pomysł.

Podsumowując - klikając na button w dowolnym Activity chciałbym wywołać metodę sendMessage() (Activity -> Service?? -> ClientThread.sendMessage()), zaś wątek z metody run() miał możliwość ingerencji w wygląd Activity - np: wyświetlał odebrane od serwera dane na ekran, pokazywał Toast'y. Chciałbym, aby połączenie było utrzymywane dopóki nie wyłączę aplikacji, bądź zrezygnuję z połączenia w Activity.

Z góry dziękuję za wskazówki.

0

Myślę, że powinieneś zainteresować się Usługami w Androidzie (Service i IntentService), wtedy mógłbyś się w wygodny sposób połączyć z Usługą i wydać konkretne polecenie z dowolnego Activity.
https://developer.android.com/guide/components/services.html

0

Ała, po co robić nieskończoną pętle ? poszukaj info o push notifications....

0

Zmodyfikowałem powyższą klasę tak aby rozszerzała Service oraz implementowała Runnable, nie wspomniałem to tym wcześniej, ale klient jak i serwer nie będzie miał dostępu do internetu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1