@CeBePHblY

(Все еще не решено)Сокет клиент. Как постоянно мониторить есть ли данные с серваера?

Есть такой клиент:
import android.os.AsyncTask;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
import java.net.UnknownHostException;

public class LoginActivity extends AppCompatActivity {

    Button buttonEnter;
    TextView textViewHeader;
    EditText editTextLogin;
    Handler handler;
    Socket client = null;
    DataOutputStream dataToServerStream = null;
    DataInputStream dataFromServerStream = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);


        buttonEnter = (Button) findViewById(R.id.buttonEnter);
        textViewHeader = (TextView) findViewById(R.id.textViewHeader);
        editTextLogin = (EditText) findViewById(R.id.editTextLogin);

        //вынос подключения к серверу в отдельный поток
        class ConnectToServer extends AsyncTask<Void, Void, Void>{

            @Override
            protected Void doInBackground(Void... voids) {
                //подключение к серверу
                try {
                    client = new Socket("193.106.169.249", 1605);
                    //чтение данных с сервера
                    /*dataFromServerStream = new DataInputStream(client.getInputStream());
                    String r="";
                    byte[] readBuffer=new byte[5*1024];
                    int read=dataFromServerStream.read(readBuffer);
                    if(read!=-1)
                    {
                        byte[] readData=new byte[read];
                        System.arraycopy(readBuffer,0,readData,0,read);
                        try{
                            r = new String(readData, "UTF-8");
                        }catch(UnsupportedEncodingException e){}
                    }*/
                } catch (UnknownHostException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    System.out.println("Got an IOException: " + e.getMessage());
                }
                return null;
            }
        }


        
        //запуск подключения к серверу
        final ConnectToServer setConnectToServer = new ConnectToServer();
        setConnectToServer.execute();

        //обработчик нажатий
        View.OnClickListener OnClickListener = new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                switch (view.getId()){
                    case R.id.buttonEnter:

                        //отправка данных на сервер
                        try {
                            String str;
                            dataToServerStream = new DataOutputStream(client.getOutputStream());
                            str = editTextLogin.getText().toString();
                            byte[] buf = str.getBytes("UTF-8");
                            dataToServerStream.write(buf, 0, buf.length);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        break;
                }
            }
        };

        buttonEnter.setOnClickListener(OnClickListener);
    }
}

Создал AsyncTask с подключением к серверу, при нажатии на кнопку логин отправляется серверу. Как теперь сделать, чтобы клиент постоянно мониторил, есть ли данные с сервера? Допустим после отправки логина/пароля сервер проверяет их и если все верно он отправляет клиенту команду "OK", а если нет, то отправляет "ERROR", клиент видит что есть данные, и в зависимости от пришедших данных открывает новое активити, либо выводит сообщение о том, что логин/пароль не верны. Если я правильно понимаю, то нужно код
dataFromServerStream = new DataInputStream(client.getInputStream());
                    String r="";
                    byte[] readBuffer=new byte[5*1024];
                    int read=dataFromServerStream.read(readBuffer);
                    if(read!=-1)
                    {
                        byte[] readData=new byte[read];
                        System.arraycopy(readBuffer,0,readData,0,read);
                        try{
                            r = new String(readData, "UTF-8");
                        }catch(UnsupportedEncodingException e){}
                    }

запустить в новом AsyncTask, и обернуть его в while и try? Нужно чтобы на каждом активити при определенном дейстивии (например нажатии на кнопку) отправлялась команда на сервер и постоянное чтение данных с сервера. Допустим пользователь нажал вкладку "Друзья", на сервер отправилась команда "SHOW_FRIENDS", а сервер сформировал данные и отправил клиенту, клиент видит что данные есть и парсит их.
  • Вопрос задан
  • 175 просмотров
Пригласить эксперта
Ответы на вопрос 1
@razer89
Android-разработчик
Сокет - очень ненадежная вещь, особенно при использовании мобильного интернета. Попробуйте взглянуть в сторону GCM, который гарантирует доставку сообщений и имеет хороший API-клиент для Android.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы