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


Автор: sith 30.3.2007, 23:19
При запуске следующего кода... дальше строки с инициализацией  inObj прога не идет... и дебагером бился... и головой ... ничерта не пойму...
... ни каких сообщений... искючений... ничего нет... тишина...
 в чем подвох... хелп ми!!!


Код

 
Socket client = new Socket(host,port);
            ObjectInputStream inObj = new ObjectInputStream(client.getInputStream());
            ObjectOutputStream outObj= new ObjectOutputStream(client.getOutputStream());
            
            outObj.writeObject("hello\n");
            outObj.flush();


Автор: nornad 30.3.2007, 23:56
Попробуй взять эти две строки в отдельный catch и ловить Throwable.
Подозреваю, что у тебя это дело происходит в отдельном потоке и исключительная ситуация просто вылетает на самый верх потока без обработки (сам с таким столкнулся недавно).

Автор: LSD 31.3.2007, 00:42
Цитата(nornad @  30.3.2007,  23:56 Найти цитируемый пост)
Подозреваю, что у тебя это дело происходит в отдельном потоке и исключительная ситуация просто вылетает на самый верх потока без обработки (сам с таким столкнулся недавно).

В таком случае ошибка будет выведена в консоль.


Цитата(sith @  30.3.2007,  23:19 Найти цитируемый пост)
... ни каких сообщений... искючений... ничего нет... тишина...

Попробуй подождать минут 10, есть подозрение что проблемы с сетью.

Автор: sith 31.3.2007, 10:07
nornad,  брал этот код в блок try/catch ничего не выдает...

...LSD моя прога обращаеться к моему же серверу находящемуся на локалхосте... почему должны быть такие задержки... причем если я использую потоки  PrintWriter/BufferedRеadеr для записи чтения то все работает нормально... но мне нужно серверу обьекты передавать...

Добавлено через 11 минут и 44 секунды
для переменной inObj в дебагере выводиться сообщение >No current context (stack frame)<

Автор: LSD 31.3.2007, 13:09
Замени:
Код
ObjectInputStream inObj = new ObjectInputStream(client.getInputStream());

на
Код
InputStream in = client.getInputStream();
ObjectInputStream inObj = new ObjectInputStream(in);

и посмотри в каком именно место произойдет зависание.

Автор: AxNe0 1.4.2007, 10:07
sith, я думаю, у тебя проблема в следующем: при инициализации
Код
ObjectInputStream inObj = new ObjectInputStream(client.getInputStream());

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

Автор: sith 1.4.2007, 20:16
LSD, почитав немногол итературы... мой гинеальный до безумности разум сделал так как ты написал... заработало... теперь мучаюсь над другой проблемкой... когда ее очертания очертяться... выложу... а пока всем большое спасибо за теплоту и поддрежку... smile

Автор: LSD 1.4.2007, 21:26
Эээ...

Ты просто разделил получение InputStream и создание ObjectInputStream и у тебя все заработало?

Автор: sith 2.4.2007, 11:58
Да простые обьекты типа  String передаються и востанавливаються нормально возникла проблема с передачей собственных обьектов классов...
... клиент отправляет следующие...

Код

InputStream in=client.getInputStream();
            OutputStream out=client.getOutputStream();
            ObjectOutputStream outObj = new ObjectOutputStream(out);
            ObjectInputStream inObj=new ObjectInputStream(in) ;  
            Message mess = new Message("","","NOOP");
            outObj.writeObject(mess);
            outObj.flush();


на сервере следующий код 

Код

Message  mess = (Message)inObj.readObject();


... при работе сервер выдает ошибку...


java.lang.ClassNotFoundException: simpletalkclient.Message
        at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:247)
        at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:604)
        at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1575)
        at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1496)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
        at simpletalkserver.ClientThread.run(ClientThread.java:55)



... почему... вроде правильно я сделал привидение типа...

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

Автор: LSD 2.4.2007, 12:03
А в CLASSPATH сервера, класс simpletalkclient.Message присутвует?
Код
Class.forName("simpletalkclient.Message");

отрабатывает без ошибок?

Автор: sith 2.4.2007, 13:01
где и как нужно прописать CLASSPATH  сервера... я разрабатываю в нет бинсе...

... куда эту строку вставлять...
Код

Class.forName("simpletalkclient.Message");

        

Автор: LSD 2.4.2007, 13:22
Цитата(sith @  2.4.2007,  13:01 Найти цитируемый пост)
где и как нужно прописать CLASSPATH  сервера... я разрабатываю в нет бинсе...

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

Цитата(sith @  2.4.2007,  13:01 Найти цитируемый пост)
... куда эту строку вставлять...

Вставь первой строкой в main сервера.

Автор: sith 2.4.2007, 14:33
нет... это два разных проекта...

Автор: LSD 2.4.2007, 14:55
Тогда тебе надо те классы которые ты собираешься передать по сети, упаковать в jar и подключить как библиотеку к обоим проектам.

Автор: sith 2.4.2007, 15:49
... так и сделал... заработало... сенкс...

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