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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Неразбериха в серверных потоках 
V
    Опции темы
sith
Дата 4.4.2007, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



есть такая тема...
... сервер для каждого нового клиента создает отдельный потоk (ClientThread) который получает обьект Socket  s для работы с клиентом... дальше в этом потоке создаються еще два потока которым передаеться все тот же  обьект Socket
один поток для чтения (InputThread) другой для отправки обьектов (OutputThread)...

... в потоке InputThread осуществляеться чтение обьекта... код следующий
Код

 do{
           
       try {
         InputStream in = null;
         ObjectInputStream inObj;
         in = s.getInputStream();
         inObj = new ObjectInputStream(in);
         
            Message response;
            try {
                response = (Message) inObj.readObject();
                setNewMessage(true);
                System.out.println(response.getTypeMess());
            }catch (ClassNotFoundException ex) {
                ex.printStackTrace();
            } 
        } catch (IOException ex) {
            ex.printStackTrace();
        } 
       
        }while(!s.isInputShutdown());


...но этот фрагмент работает... если его размещать в теле метода run потока ClientThread(то есть создателя потоков ввода вывода Input/OutputThread) в потоке InputThread  он не работает...  при работе дебагером строчка 
 response = (Message) inObj.readObject(); - просто пропускаеться... переменная не инициализируеться... и цикл продолжает выполняться... причем непонятно получаеться что метод readObject() неполучив обьекта продолжил свою работу... не понимаю... исключений никаких не вылазит... 
... ЧТО НЕ ТАК? 


--------------------
Там где ты ставишь глупые смайлики, я вбиваю восклицания знаки!!!
PM MAIL   Вверх
powerOn
Дата 4.4.2007, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Цитата(sith @  4.4.2007,  23:57 Найти цитируемый пост)
response = (Message) inObj.readObject(); - просто пропускаеться... переменная не инициализируеться... и цикл продолжает выполняться... причем непонятно получаеться что метод readObject() неполучив обьекта продолжил свою работу... не понимаю... исключений никаких не вылазит... 


есть подозрение, что ты не перекомпилировал класс. Т.е. исходник то сохранил, перекомпилировать забыл, а отладу начал гонять.  Попробуй проект почиcтить и сделать полный rebuild. Еще попробуй отладочные сообщения в консоль толкать, так уж точно будет видно как и что работает. 


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
sith
Дата 4.4.2007, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Странно все оказалось намного проще...
...
Код

ObjectInputStream inObj;
 заменил на 

Код

ObjectInputStream inObj= null
;

... правда есть еще один ньюанс мне не понятный... но о нем завтра... 


--------------------
Там где ты ставишь глупые смайлики, я вбиваю восклицания знаки!!!
PM MAIL   Вверх
cherep
Дата 6.4.2007, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



не очень понятно, для чего порождать 2 потока на чтение и запись в клинтский сокет. Не проще ли работать в рамках одного потока ClientThread?? Особенно если общение между клиентом и сервером предполагается синхронное (прочитал - записал - прочитал - ...). Иначе придется парится с синхронизацией этих 2 тредов.. Но это общие сооброжение. В специфику задачи не вникал..

Это сообщение отредактировал(а) cherep - 6.4.2007, 15:28
PM MAIL WWW ICQ   Вверх
sith
Дата 6.4.2007, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



идея моя такова... клиент и сервер всегда слушают канал... поэтому  InputThread на сервере и клиенте реализуються в отдельных потоках... при возникновении события слушатель потока узнает об этом(пришло сообщение от клиента или сервера)  обрабатывает его, выполняет свою логику и если надо создает поток для отправки ответного сообщения... 
... клиент и сервер не работают синхронно... я бы даже сказал что модель их работы событийная... событие произошло... выполнились нужные действия и опять слушать...


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

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

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


 




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


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

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