Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > Неразбериха в серверных потоках


Автор: sith 4.4.2007, 22:57
есть такая тема...
... сервер для каждого нового клиента создает отдельный пото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() неполучив обьекта продолжил свою работу... не понимаю... исключений никаких не вылазит... 
... ЧТО НЕ ТАК? 

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


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

Автор: sith 4.4.2007, 23:50
Странно все оказалось намного проще...
...
Код

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

Код

ObjectInputStream inObj= null
;

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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)