Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
5 / 5 / 1
Регистрация: 17.10.2016
Сообщений: 172
1

Зависает socket при отключении WIFI

23.05.2017, 10:07. Показов 1592. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день! Столкнулся с проблемой, если выключаю wifi на устройстве server то клиент просто повисает и все. Если закрываю socket то все хорошо(клиент ждет подключения).
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
Thread ClientThread1 = new Thread(new Runnable() {
        @Override
        public void run() {
 
            for (; ; ) {
                switch (stm) {
 
                    case 2: {
 
                        // Подключение
                        System.out.println("case 2");
                        try {
 
                            s1 = null;
                            SharedPreferences sPrefr = getSharedPreferences("SettingD", MODE_PRIVATE);
                            s1 = new Socket(sPrefr.getString("Ip", ""), Integer.valueOf(sPrefr.getString("Port", "")));
                            InputStream inStream1 = s1.getInputStream();
                            OutputStream outStream = s1.getOutputStream();
                            out1 = new PrintWriter(outStream, true);
                            in1 = new Scanner(inStream1);
                            resultStr = null;
 
 
                        } catch (IOException e) {
                            e.printStackTrace();
 
                            stm = 2;
                        }
 
                        stm = 3;
 
                    }
                    break;
 
                    case 3: {
 
                        System.out.println("case 3");
 
//                        
 
                        if (in1.hasNextLine() == true) {
 
                            scann = in1.nextLine();
                            System.out.println("> " + scann);
 
                        } else {
                     
                            stm = 2;
                            if (s1 != null) {
                                try {
                                    s1.close();
                                } catch (IOException e1) {
                                    e1.printStackTrace();
                                }
                                s1 = null;
                            }
                        }
 
                    }
 
                     break;
                }
            }
        }
        });
Добавлено через 6 минут
точнее не повисает, а останавливается на строчке
Java
1
scann = in1.nextLine();
Чтобы продолжить работу необходимо переподключить вручную. Хотелось чтобы автоматом подкидывало.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.05.2017, 10:07
Ответы с готовыми решениями:

Клиент/сервер Socket. Ошибка при отключении
Всем привет. Дело такое. У меня появилась незадача. У меня рабочий чат клиент/сервер. Дело в том,...

Asynchronous socket error 10053 при отключении клиента
Собсна, всё работает, клиент отправляет сообщение серверу, сервер принимает успешно. Но при...

При отключении устройства форма зависает
Всем привет! Такой вопрос. Написал небольшую клинтскую программку для управления одним девайсом....

Delphi XE зависает при компиляции проекта (при включенном WiFi)
Помогите разобраться в данной проблеме. На Win7 x64 установлен Delphi XE, компиляция проектов,...

13
Модератор
3387 / 2159 / 352
Регистрация: 13.01.2012
Сообщений: 8,378
23.05.2017, 10:12 2
Arion32, почему у вас в case 2 при выбросе исключения присваивается stm = 2 которое затем затирается идущим дальше кодом stm = 3?

Добавлено через 3 минуты
Arion32, попробуйте читать через inStream1.read - по идее из него должно выкинуть либо -1 либо исключение при проблемах
0
5 / 5 / 1
Регистрация: 17.10.2016
Сообщений: 172
23.05.2017, 11:03  [ТС] 3
Цитата Сообщение от vxg Посмотреть сообщение
почему у вас в case 2 при выбросе исключения присваивается stm = 2 которое затем затирается идущим дальше кодом stm = 3?
Косякнул когда копировал.
Цитата Сообщение от vxg Посмотреть сообщение
попробуйте читать через inStream1.read - по идее из него должно выкинуть либо -1 либо исключение при проблемах
подскажите как сделать?
0
Модератор
3387 / 2159 / 352
Регистрация: 13.01.2012
Сообщений: 8,378
23.05.2017, 12:53 4
Arion32, попробуйте так
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
        byte[] buffer = new byte[1024];
        ByteArrayOutputStream cs = new ByteArrayOutputStream();
        while (!Thread.currentThread().isInterrupted()) {
            try {
                int length = in.read(buffer);
                if (length == -1) {
                    //упс
                }
                cs.write(buffer, 0, length);
            } catch (IOException e) {
                //упс
            }
        }
ну а дальше cs.toByteArray() переделать в строку если это нужно

Добавлено через 2 минуты
Arion32, идея в том что бы использовать напрямую поток, а не сканер
1
5 / 5 / 1
Регистрация: 17.10.2016
Сообщений: 172
23.05.2017, 13:11  [ТС] 5
vxg, подскажите а куда вообще это надо вставлять? В case 2? И / Или вместо case 3?
0
Модератор
3387 / 2159 / 352
Регистрация: 13.01.2012
Сообщений: 8,378
23.05.2017, 13:28 6
Arion32, это должно быть в блоке case 3
1
5 / 5 / 1
Регистрация: 17.10.2016
Сообщений: 172
23.05.2017, 14:43  [ТС] 7
vxg, попробывал по вашему примеру. Ситуация аналогична сканеру. Если в ручную сокет закрывам на сервере то все хорошо, но если отключаем wifi на сервере то приложуха замирает на case 3 и все.
0
Модератор
3387 / 2159 / 352
Регистрация: 13.01.2012
Сообщений: 8,378
23.05.2017, 15:00 8
Arion32, когда сеть рвет сигнала о закрытии не приходит. по идее когда-нибудь такой сокет должен умереть, но когда.. как вариант - поставьте таймаут на чтение.
0
5 / 5 / 1
Регистрация: 17.10.2016
Сообщений: 172
23.05.2017, 15:53  [ТС] 9
Цитата Сообщение от vxg Посмотреть сообщение
таймаут на чтение
это как?
0
Модератор
3387 / 2159 / 352
Регистрация: 13.01.2012
Сообщений: 8,378
23.05.2017, 16:28 10
Arion32, я думаю так setSoTimeout
0
5 / 5 / 1
Регистрация: 17.10.2016
Сообщений: 172
23.05.2017, 16:40  [ТС] 11
Лучший ответ Сообщение было отмечено vxg как решение

Решение

vxg, Сделал таймер и каждые 5 секунд проверяется есть ли движения в потоке со switch.
Если движения нет то закрываю сокет, и вуаля поток продолжает работать(Походу он ждал закрытие сокета) Спасибо.

Добавлено через 1 минуту
вот думаю достаточно ли 5 секунд? или меньше сделать?
1
Модератор
3387 / 2159 / 352
Регистрация: 13.01.2012
Сообщений: 8,378
23.05.2017, 16:43 12
Arion32, естественно он ждет сокет, вы ведь сами сказали что он стоит на строке чтения - оно блокирующее если что. принудить к выходу можно через закрытие сокета, вы правы.

Добавлено через 1 минуту
Arion32, я бы попробовал все-таки setSoTimeout если речь идет о безусловном прерывании связи при простое. таймаут придется выбирать ориентируясь на задачу и типичную скорость обмена для целевого устройства
0
5 / 5 / 1
Регистрация: 17.10.2016
Сообщений: 172
23.05.2017, 17:00  [ТС] 13
Цитата Сообщение от vxg Посмотреть сообщение
я бы попробовал все-таки setSoTimeou
не будет примера?

Добавлено через 12 минут
Цитата Сообщение от Arion32 Посмотреть сообщение
не будет примера?
Java
1
s1.setSoTimeout(4000);
так?)
0
Модератор
3387 / 2159 / 352
Регистрация: 13.01.2012
Сообщений: 8,378
23.05.2017, 17:09 14
Arion32, да
0
23.05.2017, 17:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.05.2017, 17:09
Помогаю со студенческими работами здесь

Зависает ноутбук dell inspiron 15 3000 при установке wifi
Модель ноута Inspiron 3582 Зависает в момент установки драйвера из диспетчера устройств или...

Зависает socket
добрый день. столкнулся с проблемой зависания при отправке через send. Суть задачи: отправить с...

socket connect зависает
Добрый день. При вызове connect прога зависает. Вот код: bool...

Python 3 socket на разных компьютерах по одному wifi
Здравствуйте! Пытаюсь написать простой пример python 3 socket. Сервер import socket sock...

Socket зависает на втором Recieve
Из-за чего программа (сервер) висит на втором "r_client.Receive(data)" ??? Со стороны клиента...

После Socket.Accept() зависает приложение
После строки Socket.Accept() зависает приложение ,я знаю что этот метод останавливает выполнение...


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

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