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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка сообщений от сокета в главном потоке, Обработка сообщений от сокета в главно п 
:(
    Опции темы
ushakofff
Дата 18.4.2009, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вопрос в следующем ... есть некий класс JSocketConnection который описывает считывание неких пакетов из сокета ... это чтение производится в отдельном потоке, в этом потоке инфа из сокета белится на отдельные пакеты, и вот мне нужно чтобы обработка этих пакетов происходила в главном потоке Main, а не в потоке чтения инфы из сокета JSocketConnection, как это красиво и надежно реализовать. В принципе я понимаю что нужно завести защищенный буфер пакетов и в одном потоке в него кидать а вдругом его разбирать, но как из потока JSocketConnection уведомить главный поток о том что появилось собщение?


Код

public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        JMainForm mainForm = new JMainForm();
        mainForm.setVisible(true);
    }

}



Код

public class JSocketConnection extends Thread {
    
    
    public boolean openConnection(JATSVisualCenterDoc document);
    public void closeConnection();

    public void parseObject( JSONObject obj ) throws JSONException {
        JServerMessage serverMessage;

        for( int i = 0; i < obj.names().length(); i++ ) {
            if( obj.names().get(i).toString().equals("ans_alarm") ) {
                parseAlarmMessage( obj );
            } else if( obj.names().get(i).toString().equals("ans_state") ) {
                parseStativMessage( obj );
            } else if( obj.names().get(i).toString().equals("ans_auth") ) {
                parseAuthMessage( obj );
            } else if( obj.names().get(i).toString().equals("ans_view") ) {
                parseViewMessage( obj );
            } else if( obj.names().get(i).toString().equals("ans_users") ) {
                parseUsersMessage( obj );
            }
        }
    }


    @Override
    public void run() {        
        Scanner in = new Scanner(inpStream);

        while( true ) {
            if( in.hasNextLine() ) {
                String inpLine = in.nextLine();

                for(int i = 0; i < inpLine.length(); i++) {
                    if(inpLine.charAt(i) == '{') count++;
                    if(inpLine.charAt(i) == '}') count--;

                    jsonString += inpLine.charAt(i);

                    if( count == 0 ) {

                        if( jsonString.length() > 4 ) {
                            System.out.println("inp - " + jsonString );

                            JSONObject obj;

                            try {
                                obj = new JSONObject( jsonString );//привет Витя!!!
                                parseObject( obj );
                            } catch (JSONException e) {
                                System.err.println("JSocketConnection.run - " + e.getMessage());
                            }
                        }

                        jsonString = "";
                        
                    }
                }
            }
        }
    }
}


PM MAIL   Вверх
Proger10
Дата 18.4.2009, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А методы никакие главного потока не получается вызывать из этого? (думаю так и можно уведомить..)
PM MAIL   Вверх
ushakofff
Дата 18.4.2009, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Методы получается вызвать но происходит какая то ерунда ... подвисает поток чтения из сокета и больше ничего читать не хочет :( поэтому я и подумал что лучше бы обрабатывать не в этом потоке а в главном.
PM MAIL   Вверх
Vitaly333
Дата 18.4.2009, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата

В принципе я понимаю что нужно завести защищенный буфер пакетов и в одном потоке в него кидать а вдругом его разбирать, но как из потока JSocketConnection уведомить главный поток о том что появилось собщение?

Заведите что то типа очереди (BlockingQueue). Если из сокета пришли какие-то данные , то кидаете их в очередь на обработку. Если в очереди есть какие то данные то обработчик выдирает их из очереди и обрабатывает. Но лучше это делать  в отдельном потоке а не в main, т.к. если в очереди ничего не будет то обработчик будет блокирован.
PM MAIL   Вверх
nucer
Дата 29.4.2009, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 118
Регистрация: 21.6.2004
Где: Москва

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



Vitaly333 дело говорит  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

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


 




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


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

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