Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
CeBePHb1YY
0 / 0 / 0
Регистрация: 11.01.2013
Сообщений: 12
#1

Как заставить сокет клиента слушать данные с сервера постоянно? - Android

11.02.2016, 19:54. Просмотров 380. Ответов 8
Метки нет (Все метки)

есть такой клиент
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import android.os.AsyncTask;
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;
    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);
 
        //asyntask
        class ConnectToServer extends AsyncTask<Void, Void, Void>{
            @Override
            protected Void doInBackground(Void... voids) {
                //подключение к серверу
                try {
                    client = new Socket("193.106.169.249", 1605);
                    dataToServerStream = new DataOutputStream(client.getOutputStream());
                    dataFromServerStream = new DataInputStream(client.getInputStream());
                } catch (UnknownHostException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    System.out.println("Got an IOException: " + e.getMessage());
                }
                return null;
            }
        }
 
        ConnectToServer Connect = new ConnectToServer();
        Connect.execute();
 
 
        class GetDataFromServer extends AsyncTask<Void, Void, Void>{
 
            @Override
            protected Void doInBackground(Void... voids) {
                //чтение данных с сервера
                while (true) {
                    try {
                        String r = "";
                        byte[] readBuffer = new byte[5 * 1024];
                        int read = 0;
                        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 (IOException e) {
                        e.printStackTrace();
                    }
                    return null;
                }
            }
        }
 
        GetDataFromServer GetData = new GetDataFromServer();
        GetData.execute();
 
 
        //обработчик нажатий
        View.OnClickListener OnClickListener = new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                switch (view.getId()){
                    case R.id.buttonEnter:
                        try {
                            //отправка данных на сервер
                            String sendText = editTextLogin.getText().toString();
                            byte[] buf = sendText.getBytes("UTF-8");
                            dataToServerStream.write(buf, 0, buf.length);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        break;
                }
            }
        };
 
        buttonEnter.setOnClickListener(OnClickListener);
    }
}
работает хорошо - подключается, по нажатию кнопки данные отправляются, но при отправки данных сервер отправляет в ответ данные, а приложение только один раз их видит, при последующих нажатия он не читает данные с сервера. скажи как исправить?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.02.2016, 19:54     Как заставить сокет клиента слушать данные с сервера постоянно?
Посмотрите здесь:

Android клиент-серверное приложение. Не могу получить данные с сервера Android
Клиент на Android не получает данные с сервера Android
Как "слушать и читать" SMS c определенного номера? Android
Android Узнать название api\ протокола\ способа\ метода общения клиента и сервера
Как извлечь данные из сервера Parse, чтобы эти данные были видны всем? Android
Android На смарт получить данные с сервера
Получить данные из mySLQ с удаленного сервера Android
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
12.02.2016, 09:37     Как заставить сокет клиента слушать данные с сервера постоянно? #2
Цитата Сообщение от CeBePHb1YY Посмотреть сообщение
подключается
Да, возможно, даже скорее всего.

Цитата Сообщение от CeBePHb1YY Посмотреть сообщение
по нажатию кнопки данные отправляются
Это вряд ли, поскольку по приведенному коду к нажатию кнопки выполняемые действия не имеют ни малейшего отношения.

Цитата Сообщение от CeBePHb1YY Посмотреть сообщение
при последующих нажатия он не читает данные с сервера
См. свой код, что происходит по нажатию кнопки.
CeBePHb1YY
0 / 0 / 0
Регистрация: 11.01.2013
Сообщений: 12
12.02.2016, 17:02  [ТС]     Как заставить сокет клиента слушать данные с сервера постоянно? #3
Armagedo, по нажатию, данные отправляются, сервер их видит, так что это работает. мне нужно, чтобы клиент не зависимо от каких действий/бездействий принимать данные с сервера и в зависимости от них, что-то делать. я сделал новый асинктаск GetDataFromServer и поместил код приема данных в цикл while, в надежде на то, что это позволит постоянно мониторить сокет на входящие данные. но на деле чтение данных происходит всего один раз, а дальше молчание. почему так происходит?
CoolMind
417 / 400 / 65
Регистрация: 06.10.2012
Сообщений: 1,713
12.02.2016, 17:15     Как заставить сокет клиента слушать данные с сервера постоянно? #4
CeBePHb1YY, выбросьте AsyncTask и сделайте Thread в бесконечном цикле с паузами. Какой метод для работы с сокетами вы выбрали? Можно работать с 2 потоками, один работает бесконечно, а второй периодически опрашивает сервер, но при этом может отвалиться. Я уже подзабыл, что там да как.
CeBePHb1YY
0 / 0 / 0
Регистрация: 11.01.2013
Сообщений: 12
12.02.2016, 17:40  [ТС]     Как заставить сокет клиента слушать данные с сервера постоянно? #5
CoolMind, а если мне нужно, чтобы приложение принимало данные с сервера когда оно не запущено? это значит функцию приёма надо пихать в сервис? и вот еще что: я же положил в бесконечный цикт while приём данных, почему срабатывает всего 1 раз? или обязательна некоторая пауза, допустим sleep в 3 секунды?
CoolMind
417 / 400 / 65
Регистрация: 06.10.2012
Сообщений: 1,713
12.02.2016, 17:44     Как заставить сокет клиента слушать данные с сервера постоянно? #6
CeBePHb1YY, да, наверное, службой, но она тоже может быть уничтожена.
Для всего остального вам поможет отладчик.
Паблито
резкий
1960 / 1695 / 525
Регистрация: 12.05.2014
Сообщений: 6,046
Завершенные тесты: 1
12.02.2016, 18:49     Как заставить сокет клиента слушать данные с сервера постоянно? #7
Цитата Сообщение от CeBePHb1YY Посмотреть сообщение
а если мне нужно, чтобы приложение принимало данные с сервера когда оно не запущено? это значит функцию приёма надо пихать в сервис?
и тут возникает целый ряд вопросов - вот пришло сообщение, сервис его принял и что дальше? выводить нотификейшн, писать в базу, создавать интент на который среагирует активити?
Цитата Сообщение от CeBePHb1YY Посмотреть сообщение
и вот еще что: я же положил в бесконечный цикт while приём данных, почему срабатывает всего 1 раз? или обязательна некоторая пауза, допустим sleep в 3 секунды?
а почему не использовать BufferedReader и не читать по строкам в бесконечном цикле?
утрированый код
Java
1
2
3
4
5
6
7
8
        try (InputStream is = client.getInputStream()) {
            BufferedReader lines = new BufferedReader(new InputStreamReader(is, "UTF-8"));
            while (true) {
                String line = lines.readLine();
                if (line == null) break;
                System.out.println("Incoming string: " + line);
            }
        }
пока строка не примется полностью - цикл дальше не крутится, батарея не садится
строка принялась полность - что-то делаем, как-то реагируем
CeBePHb1YY
0 / 0 / 0
Регистрация: 11.01.2013
Сообщений: 12
12.02.2016, 19:07  [ТС]     Как заставить сокет клиента слушать данные с сервера постоянно? #8
Паблито, как клиент получит данные, будет производится определённое действие, завясящее от того, что пришло. просто я только начинаю изучать андроид, очень мало знаю, стараюсь учиться, читать. за наводку спасибо, как попробую - отпишусь, сейчас нет доступа к ПК.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.02.2016, 01:19     Как заставить сокет клиента слушать данные с сервера постоянно?
Еще ссылки по теме:

Взаимодействие сервера (Windows) и клиента (Андроид) Android
Нужен пример работы Socked клиента, который получает некую инфу от сервера Android
Android Как слушать широковещательные намерения?
Android Как слушать видео не выводя видео на экран
Подключение android-клиента через сокет Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
xaat
43 / 16 / 6
Регистрация: 05.12.2015
Сообщений: 65
13.02.2016, 01:19     Как заставить сокет клиента слушать данные с сервера постоянно? #9
а если мне нужно, чтобы приложение принимало данные с сервера когда оно не запущено? это значит функцию приёма надо пихать в сервис? и вот еще что: я же положил в бесконечный цикт while приём данных, почему срабатывает всего 1 раз? или обязательна некоторая пауза, допустим sleep в 3 секунды?
GCM используй и будет тебе счастье )... нечего батарею на устройстве садить бесконечным опросом сервера.
Yandex
Объявления
13.02.2016, 01:19     Как заставить сокет клиента слушать данные с сервера постоянно?
Ответ Создать тему
Опции темы

Текущее время: 04:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru