Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
22 / 7 / 2
Регистрация: 26.10.2012
Сообщений: 212
Записей в блоге: 1
1

Как создать постоянное сокет-соединение?

06.12.2018, 16:34. Показов 1124. Ответов 2

Author24 — интернет-сервис помощи студентам
Доброго дня.
Необходимо создать постоянное соединение телефона с сервером посредством сокета. Для этого была создана служба, в которой стартует тред, в котором в свою очередь создаётся сокет соединение и 2 потока (DataOutpuStream и DataInputStream) и в бесконечном цикле пока не поступит команда на уничтожение треда считываются и обрабатываются входящие данные и отправляются исходящие. Всё работает до какого-то момента, пока на отправку не поступит "большой" объём данных, более 2-3 Кб. Дальнейшая отправка недоступна. Метод run треда ниже.

Кликните здесь для просмотра всего текста
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
@Override
    public void run() {
 
        try (
             Socket s=new Socket(IP,PORT);
             DataOutputStream out = new DataOutputStream(s.getOutputStream());
             InputStream is = s.getInputStream();)
        {
 
            while (!isInterrupted()){
 
                if (is.available()>0){
 
                    byte[] in_array= new byte[is.available()];
 
                    int read_bytes = is.read(in_array);
 
                    String check_str = new String(in_array,OFFSET,LENGHT,StandardCharsets.UTF_8);
 
                    if (check_str.equals("CHECK")){
 
                        ByteBuffer byteBuffer = ByteBuffer.wrap(in_array,PAYLOAD_OFFSET,PAYLOAD_LENGHT);
                        int payload_size = byteBuffer.getInt(); 
 
                        if (payload_size==(read_bytes-LENGHT-PAYLOAD_LENGHT)){
 
                            byte[] payload_array = Arrays.copyOfRange(
                                    in_array,
                                    TSDS_LENGHT+PAYLOAD_LENGHT,
                                    in_array.length);
 
                            Data cd = unpackMessage(payload_array);
 
                            runTask(out, cd);
                        }
                    }
                }
                SystemClock.sleep(TIMEOUT);
            }
        }
        catch (IOException e) {
            Logs.error(this,e.toString(), e);
        }
    }

Исходящий поток out передаётся в runTask, там стартует AsyncTask и по завершении работы отправляет данные в out. Попытки понять почему после некоторого количества данных в 90% исходящий перестаёт отправлять сообщение понять не удалось. Никаких ошибок не выпадает, огромное количество логгирующих сообщений (выше в коде удалил их) тоже ничего не проясняют.
Попытки найти причину в сети не помогли, пример схожей проблемы, там не смогли победить проблему и просто перешли на UDP.

Второй вопрос связанный с первым. Достаточно часто встречаются примеры реализации Socket соединения, имеющие примерно следующий вид (Полный код тут):
Кликните здесь для просмотра всего текста
Java
1
2
3
4
while ((bytesRead = inputStream.read(buffer)) != -1) {
                byteArrayOutputStream.write(buffer, 0, bytesRead);
                response += byteArrayOutputStream.toString("UTF-8");
            }

Собрал проект у себя на 2 телефонах, это клиент-серверное решение работает, правда там нет постоянного соединения. Но может кто-нибудь объяснить своими словами, что происходит в этом цикле? Как связаны исходящий и входящий потоки? Не понимаю, почему считывание выполняется пока что есть входящие данные, что-ли? А что тогда происходит если они разной длинны? Не очевидный код если честно, и нигде объяснения не могу найти.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.12.2018, 16:34
Ответы с готовыми решениями:

Как организовать постоянное соединение с БД
Как в ASP организовать постоянное соединение с БД? Для коннекта использую технологию ADO. Примерно...

Как только происходит попытка создать сокет для UDP - сокет TCP сразу ломается (выдает 10093).
Добрый день. Пытаюсь сделать соединение, использующее два канала обмена данными - TCP для...

Как работает сокет соединение в PHP?
Может ли кто-нибудь объяснить как работает сокет соединение в PHP ? Дело в том что на сервер один...

Постоянное соединение с БД
Вопрос в том, как сделать так что бы только при установке один раз вводить инфу для подключения к...

2
Модератор
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,413
06.12.2018, 18:39 2
arvalon, данные передаваемые через потоковый сокет могут быть произвольным образом фрагментированы - например послали 123456 пришло 12 потом 3 потом 456 - рассматривайте их именно как поток, читать такой поток и получать из него структуры данных при их полном получении должен ваш код
0
69 / 62 / 13
Регистрация: 10.01.2012
Сообщений: 508
06.12.2018, 23:27 3
Создать не проблема. Проблема удержать. Точнее определить когда оно пропало, в том числе и так называемое состояние "полуконнект" - это когда связь, например с маршрутизатором есть ( или еще какого другого устройства типа узла провайдера ), а от него далее обрыв случился.
0
06.12.2018, 23:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.12.2018, 23:27
Помогаю со студенческими работами здесь

Постоянное сокетное соединение
Доброво времени суток! Есть ли возможность создать постоянное сокетное соединение не используя на...

Постоянное соединение postgres с php
Здравствуйте! В общем пробую после mysql - posgresql. Проблема в скорости подключения:...

Постоянное соединение клиент-сервер
Доброго времени суток уважаемые. Возникла такая проблема: Требуется приложение клиент-сервер,...

Организовать постоянное http соединение
Здравствуйте. Суть проблемы: есть сервер и клиент на .net. на сервере с помощью TcpListener...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru