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

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

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

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

11.02.2016, 19:54. Просмотров 483. Ответов 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);
    }
}
работает хорошо - подключается, по нажатию кнопки данные отправляются, но при отправки данных сервер отправляет в ответ данные, а приложение только один раз их видит, при последующих нажатия он не читает данные с сервера. скажи как исправить?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.02.2016, 19:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как заставить сокет клиента слушать данные с сервера постоянно? (Программирование Android):

Подключение android-клиента через сокет - Программирование Android
К осуществить соединение между андроид-клиентом и сервером посредством сокета? Сокет требует ip-адрес и порт. Но сервер компьютера...

Как извлечь данные из сервера Parse, чтобы эти данные были видны всем? - Программирование Android
У меня есть активити, где есть строка, куда вводишь данные и они отправляются на сервер, и они сохраняются именно в этом активити и их вижу...

Взаимодействие сервера (Windows) и клиента (Андроид) - Программирование Android
Доброго времени суток, уважаемые разработчики! СКажите пожадлуйста! Требуется организовать клиент серверное взаимодействие между...

Как слушать широковещательные намерения? - Программирование Android
Вот такая функция открывает географическую карту с нужными координатами. На самом деле там несколько приложений которые реагируют на это...

Узнать название api\ протокола\ способа\ метода общения клиента и сервера - Программирование Android
Нужно узнать название api\протокола\способа\метода общения клиента и сервера. Есть одно приложение передает на сервер первый пакет по 80...

Нужен пример работы Socked клиента, который получает некую инфу от сервера - Программирование Android
Может кто скинуть пример работы Socked клиента, который получает некую инфу от сервера? Я хочу сделать мониторинг игрового сервера с...

8
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
12.02.2016, 09:37 #2
Цитата Сообщение от CeBePHb1YY Посмотреть сообщение
подключается
Да, возможно, даже скорее всего.

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

Цитата Сообщение от CeBePHb1YY Посмотреть сообщение
при последующих нажатия он не читает данные с сервера
См. свой код, что происходит по нажатию кнопки.
0
CeBePHb1YY
0 / 0 / 0
Регистрация: 11.01.2013
Сообщений: 12
12.02.2016, 17:02  [ТС] #3
Armagedo, по нажатию, данные отправляются, сервер их видит, так что это работает. мне нужно, чтобы клиент не зависимо от каких действий/бездействий принимать данные с сервера и в зависимости от них, что-то делать. я сделал новый асинктаск GetDataFromServer и поместил код приема данных в цикл while, в надежде на то, что это позволит постоянно мониторить сокет на входящие данные. но на деле чтение данных происходит всего один раз, а дальше молчание. почему так происходит?
0
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
12.02.2016, 17:15 #4
CeBePHb1YY, выбросьте AsyncTask и сделайте Thread в бесконечном цикле с паузами. Какой метод для работы с сокетами вы выбрали? Можно работать с 2 потоками, один работает бесконечно, а второй периодически опрашивает сервер, но при этом может отвалиться. Я уже подзабыл, что там да как.
0
CeBePHb1YY
0 / 0 / 0
Регистрация: 11.01.2013
Сообщений: 12
12.02.2016, 17:40  [ТС] #5
CoolMind, а если мне нужно, чтобы приложение принимало данные с сервера когда оно не запущено? это значит функцию приёма надо пихать в сервис? и вот еще что: я же положил в бесконечный цикт while приём данных, почему срабатывает всего 1 раз? или обязательна некоторая пауза, допустим sleep в 3 секунды?
0
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
12.02.2016, 17:44 #6
CeBePHb1YY, да, наверное, службой, но она тоже может быть уничтожена.
Для всего остального вам поможет отладчик.
0
Pablito
2477 / 1961 / 611
Регистрация: 12.05.2014
Сообщений: 6,866
Завершенные тесты: 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);
            }
        }
пока строка не примется полностью - цикл дальше не крутится, батарея не садится
строка принялась полность - что-то делаем, как-то реагируем
0
CeBePHb1YY
0 / 0 / 0
Регистрация: 11.01.2013
Сообщений: 12
12.02.2016, 19:07  [ТС] #8
Паблито, как клиент получит данные, будет производится определённое действие, завясящее от того, что пришло. просто я только начинаю изучать андроид, очень мало знаю, стараюсь учиться, читать. за наводку спасибо, как попробую - отпишусь, сейчас нет доступа к ПК.
0
xaat
43 / 16 / 6
Регистрация: 05.12.2015
Сообщений: 65
13.02.2016, 01:19 #9
а если мне нужно, чтобы приложение принимало данные с сервера когда оно не запущено? это значит функцию приёма надо пихать в сервис? и вот еще что: я же положил в бесконечный цикт while приём данных, почему срабатывает всего 1 раз? или обязательна некоторая пауза, допустим sleep в 3 секунды?
GCM используй и будет тебе счастье )... нечего батарею на устройстве садить бесконечным опросом сервера.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.02.2016, 01:19
Привет! Вот еще темы с ответами:

Доработать сокет клиента и сокет сервера - C++
Есть клиент с адресом 192.168.73.2 и сервер (192.168.73.145). Необходимо с помощью низкоуровневого сокета SOCK _ RAW разработать генератор...

Взаимодействие локального AIR сокет-сервера и клиента - ActionScript
Есть сокет сервер на AIR и клиент который к нему подключается, возможно ли разместить сервер на хостинге чтоб можно было подключиться по...

Соединение через сокет и синхронность работы клиента и сервера - C#
Доброго времени суток! Попытаюсь изложить свою проблему вкратце: Необходимо реализовать одновременный клик левой кнопкой мыши на 2-ух...

Как научить клиента слушать? - C++ Linux
Написал сервер с клиентом. Научил клиента передавать файлы на сервер. Теперь надо научить передвать файлы с одного клиента на другой....


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

Или воспользуйтесь поиском по форуму:
9
Yandex
Объявления
13.02.2016, 01:19
Ответ Создать тему
Опции темы

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