powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / Android [игнор отключен] [закрыт для гостей] / "Устойчивый" Android клиент. Правильная работа с Socket'ом(потоком).
4 сообщений из 4, страница 1 из 1
"Устойчивый" Android клиент. Правильная работа с Socket'ом(потоком).
    #37044828
ivan.pupkoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нужно иметь "устойчивое соединение" Android-клиента с сервером.
1. Клиент пытается соединиться с сервером через каждые 5(10, N)-секунд.
2. В случае соединения происходит получение данных от сервера.
3. В случае разрыва переход к пункту 1.

Тестирование происходит через отключение/включение сервера.
После долгого отключения сервера клиент "залипает", "не принимает" сообщения с сервера (возможно заблокирован потом приема).
При этом сообщения с сервера уходят.

Через NIO то же самое, после долгого отключения не заходит в ключ ON_CONNECT и finishConnect() всегда false.
Хотя на стандартном клиенте(J2SE) NIO отрабатывался нормально (тот же самый код).

Складывается ощущение, что поток, который обрабатывает input.read(...), где-то блокируется Object.wait().
Т.е. наступает deadlock с потоками, обрабатывающими ГУИ.

Что делаю не правильно? В какую сторону смотреть? Что умного посмотреть/почитать?

Сложность еще в том, что "отрубается" лог Android'а (Eclipse plugin), в эмуляторе видно динамику, в логе - нет.


Код сервера:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
                Socket s = ss.accept();
                InputStream input = s.getInputStream();
                 final  OutputStream output = s.getOutputStream();
                 new  Thread() {
                     public   void  run() {
                         while  (true) {
                             try  {
                                ik++;
                                String msg = "Hello # " + ik;
                                System.err.print("Send..." + msg);
                                output.write(msg.getBytes());
                                output.flush();
                                System.err.println(" OK!");
                            }  catch  (Throwable ioe) {
                                System.err.println(" WRONG!");
                                 break ;
                            }
                             try  {
                                Thread.sleep( 300 );
                            }  catch  (Exception ioe) {
                            }
                        }
                    }
                }.start();

Код клиента:
Код: plaintext
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.
     private   void  initSocket() {
         try  {
             if  (socket ==  null  || socket.isClosed() == true
                    || socket.isConnected() == false) {
                socket =  new  Socket();
                socket.connect(socketAddress,  5000 );
            }
        }  catch  (Throwable t) {
            System.err.println(t);
        }
    }

     private   void  closeSocket() {
         try  {
             if  (socket !=  null  && socket.isClosed() == false) {
                socket.close();
            }
        }  catch  (Throwable t) {
            System.err.println(t);
        }
    }

     private   byte [] buffer =  new   byte [ 1024 ];

     public   void  run() {
         while  (isActive) {
             try  {
                notifyDataListener( 1 );
                initSocket();
                InputStream input = socket.getInputStream();
                 int  length = input.read(buffer);
                 if  (length <  0 ) {
                     throw   new  EOFException("Was got -1");
                }
                notifyDataListener( 2 );
            }  catch  (Throwable t) {
                notifyDataListener( 3 );
                closeSocket();
                 try  {
                    Thread.sleep( 3000 );
                }  catch  (InterruptedException ie) {
                }
            }
        }
    }

     private   void  notifyDataListener( int  typeNotify) {
         try  {
             if  (dataListener !=  null ) {
                 switch  (typeNotify) {
                 case   1 :
                    dataListener.onStart();
                     break ;
                 case   2 :
                    dataListener.onRead();
                     break ;
                 case   3 :
                    dataListener.onError();
                     break ;
                }
            }
        }  catch  (Throwable t) {
            t.printStackTrace();
        }
    }
...
Рейтинг: 0 / 0
"Устойчивый" Android клиент. Правильная работа с Socket'ом(потоком).
    #37044850
raidan2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Android -- он такой же как дрова.
...
Рейтинг: 0 / 0
"Устойчивый" Android клиент. Правильная работа с Socket'ом(потоком).
    #37046043
пролетевший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А InterruptedException таки игнорируются или просто сократили текст ?
Android может останавливать потоки если приложение не активно, после чего ваш код зависнет ( что похоже и происходит ).
...
Рейтинг: 0 / 0
"Устойчивый" Android клиент. Правильная работа с Socket'ом(потоком).
    #37046073
ivan.pupkoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пролетевшийА InterruptedException таки игнорируются или просто сократили текст ?
Android может останавливать потоки если приложение не активно, после чего ваш код зависнет ( что похоже и происходит ).
Кусок кода как есть, не думаю, что этот поток останавливается.
Приложение "виснет" в течение 1-2 минут (~200 попыток сделать соединение с сервером), при этом есть динамика в GUI.
Блокируется, где-то/что-то уровнем ниже.

Исследуя далее выяснилось следующее, если устанавливать низкоуровневый таймаут на чтение
socket.setSoTimeout(500);
то выскакивает исключение, т.е. коннект к серверу
socket.connect(...)
проходит и застревает в
input.read(...) ,
при этом сервер успевает передать порцию данных до завершения коннекта.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Android [игнор отключен] [закрыт для гостей] / "Устойчивый" Android клиент. Правильная работа с Socket'ом(потоком).
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]