Модераторы: javastic, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разрыв сокет соединения в LWUIT 
V
    Опции темы
QTrueFalse
Дата 23.10.2011, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 26.1.2011

Репутация: нет
Всего: нет



Всем доброго времени суток. 
Я второй день уже бьюсь над одним вопросом. Вобщем, у меня есть мидлет на LWUIT и есть сокет соединение(входящий и исходящий thread-ы из сдантартного sun-овского примера для работы с сокетами). Имеет место быть один не понятный мне глюк, который я никак не могу отследить. Так вот, если говорить конкретно, то, мне приходит сообщение с данными по сети, эти данные обрабатываются и добавляются в контейнер List. И пока они приходят медленно друг за другом - всё хорошо. А вот если выслать друг за другом быстра два таких сообщения с данными, то выдруг, откуда не возьмись, в inputStream входящего потока, появляется -1 (connectionClosed). Причём появляется она там циклично, до тех пор, пока соединение не разорвётся(да, я пробывал просто считывать единицу и игнорировать её - непрокатывает). Есстественно, сервер мне эту -1 не шлёт - она появляется там буквально "ниоткуда". С помощью дебагера я "выяснил", что такое случается, когда предыдущее сообщение ещё не обработано и не добавлено в лист, а в inputStream уже поступило следующее сообщение - типа как будто "неуспело" добавится первое, а уже подошло второе - вот тогда появляется -1 эта... Я схитрил и частично решил проблему тем, что "усыплял" (sleep(1000)) поток на секунду, какбы "давая время" добавится сообщению в лист. Но всё равно, время от времени выскакивает -1. Да и некрасиво это както. Подскажите пожалуйста, в чём может быть проблема и куда можно "покопать"?
Стоит сказать, что есть такое же приложение, но со стандартными элементами(без LWUIT), так вот там как быстро не шли - всё проихсодит чётко и без задоринки.
Думал использовать NetworkManager в льюите - но как я понял, он http-шный, а мне нужно именно сокет-соединение.
Заранее спасибо за помощь smile
PM MAIL   Вверх
oxigen
Дата 24.10.2011, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 12.4.2010

Репутация: 4
Всего: 4



Если добавите фрагмент кода, который вызывает ошибку, возможно будет проще понять.

Чтение из сокета и добавление в лист в разных потоках происходит?
PM MAIL   Вверх
QTrueFalse
Дата 24.10.2011, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 26.1.2011

Репутация: нет
Всего: нет



Видимо в разных потоках, потому как главный поток "темы" ЛЬЮИТА запускается в методе run в классе МИДлета:
Код

    public void run() {
        new StateMachine("/first.res");
    }

Ну и это полюбому будет главный поток, так то. А добавление в лист происходит, посути, в потоке, который следит за сетью - inputStream. Ну, фактически в этом потоке есть функция, которая срабатывает как тока чтото появляется во входящем потоке - она вызывает ещё какуюто функцию, в зависимости от того, что пришло - ну вобщем в этом потоке стэк функций свой появляется и в конечной функции происходит обычный 
Код

list.addItem(hashtable);

Если НЕ добавлять в лист - то как угодно быстро шли - всё замечательно. А вот если добавить оператор добавления в лист, и он "неуспеет" добавить до того, как придёт чтото ещё по сети - то сразу, почемуто, в inputStream появляется -1 (разрыв соединения) и всё рухается... Эксепшены в этом потоке ловятся - все кэтчи стоят, но ниодин не срабатывает - тупо появляется -1 изниоткуда и всё тут...
Я не могу код конкретно показать - он так то у меня на работе, выносить запрещено. Но там и нечего показывать то особо - сетевой поток из обычного САНовского примера для работы с сетью, с сокетами. "NetworkDemo"...
Код

    public void run() {
        try {
            while (true) { //infinite loop to let the server be always ready for connection (code by robin_alden, issue #126227)
                si.setText("Waiting for connection");
                scn = (ServerSocketConnection) Connector.open("socket://:5000");

                // Wait for a connection.
                sc = (SocketConnection) scn.acceptAndOpen();
                si.setText("Connection accepted");
                is = sc.openInputStream();
                os = sc.openOutputStream();
                sender = new Sender(os);

                // Allow sending of messages only after Sender is created
                f.addCommand(sendCommand);

                while (true) {
                    StringBuffer sb = new StringBuffer();
                    int c = 0;

                    while (((c = is.read()) != '\n') && (c != -1)) {
                        sb.append((char) c);
                    }

                    if (c == -1) {
                        break;
                    }

                    si.setText("Message received - " + sb.toString()); // ТОЛЬКО ВОТ ТУТ ВЫЗЫВАЕТСЯ МОЯ ФУНКЦИЯ, В КОТОРОЙ НАХОДИТСЯ switch
                     //Вот тут я поставил sleep(1000) на время, чтобы дать время сообщению добавиться в лист, перед тем как второе придёт
                }

                stop();
                si.setText("Connection is closed");
                f.removeCommand(sendCommand);
                Thread.sleep(3000);
            }
        } catch (IOException ioe) {
            if (ioe.getMessage().equals("ServerSocket Open")) {
                Alert a = new Alert("Server", "Port 5000 is already taken.", null, AlertType.ERROR);
                a.setTimeout(Alert.FOREVER);
                a.setCommandListener(this);
                display.setCurrent(a);
            } else {
                if (!stop) {
                    ioe.printStackTrace();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Повторюсь: проблема проявляет себя только тогда, когда друг за другом приходят два сообщения аналогичных. Тоесть типа первое ещё не успело обработаться, а второе уже "стучится"...
PM MAIL   Вверх
oxigen
Дата 25.10.2011, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 12.4.2010

Репутация: 4
Всего: 4



Мистика )

Но если гадит именно эта строчка, хоть и не понимаю, как она может гадить
Код

si.setText("Message received - " + sb.toString());


то может стоит попробовать убрать ее в отдельный поток. Тогда она по идее никак не будет влиять на чтение.

Код

final String str = "Message received - " + sb.toString();
Thread t = new Thread() {
    public void run() {
        si.setText(str);                    
    }
};
t.start();


Это конечно не полноценное решение. Но может поможет понять, что ж там происходит...

PM MAIL   Вверх
QTrueFalse
Дата 25.10.2011, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 26.1.2011

Репутация: нет
Всего: нет



Гадит не именно она. Вместо неё вызвается функция, в которой находится switch. Проще говоря эта функция смотрит какая команда пришла и дальше, в зависимости от того, что пришло - либо показывает чтото, либо записывает чтото кудато и тд вобщем. Я пробывал убирать в отдельный поток - но чуть подругому. Я сразу создаю поток который спит, а потом, когда чтото приходит, функций бужу этот поток и передаю туда то, что пришло. (вобщем чтобы стек вызовов разгрузить у потока, который смотрит сеть. Но это тоже не помогает...
Сегодня я заметил ещё один глюк, причём ещё более жестокий. Так вот, если по сети придёт какоето то сообщение, В МОМЕНТ когда ГУИ совершает какое-либо действи(переход с формы на форму, или там анимация какаято), то тупо абсолютно также появляется -1 и всё соединение обрывается. ПРИЧЁМ по сети может придти что угодно, ДАЖЕ НЕ ТРОГАЮЩЕЕ элементы ГУИ, библиотеку и тд- просто если чтото послать в момент когда ГУИ чтото анимирует - сеть падает, вот и всё... не знаю, может это както наведет вас на определенные мысли... и както поможет... ибо я дак уже ваще внепонятках совершенно...
PM MAIL   Вверх
oxigen
Дата 26.10.2011, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 12.4.2010

Репутация: 4
Всего: 4



Странное поведение.
Никаких разумных мыслей нет.
Разве что баг конкретного телефона/симулятора..
PM MAIL   Вверх
QTrueFalse
Дата 26.10.2011, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 26.1.2011

Репутация: нет
Всего: нет



oxigen, спасибо, всё разобрался вроде smile Дело действительно было в эмуляторе. Использовал нокиевский СДК 5 редакции - вот он выдавал такие глюки. Попробывал на стандртном нетбинковском джаваЭфИкс, потом попробывал ещё на нокиевском для 3-ей редакции - всё отлично, никаких глюков, лагов, "минус единиц" и тд и тп)
Спасибо за ответы smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




[ Время генерации скрипта: 0.0457 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.