Передо мной стоит задача - написать сервер и клиент подобия ICQ, но для локальной сети. Функциональность конечно точно такая же не требуется, главное - передача сообщений. Для этого создал класс Message и кидаюсь его объектами через ObjectInputStream и ObjectOutputStream. В общем всё нормально, сообщения приходят (пока хотя бы на сервер). Правда в начале столкнулся с той же проблемой, что и господин sith в теме http://forum.vingrad.ru/topic-143781.html. Причём тоже не мог её решить, в том числе и тем способом, который был указан там. Объяснить каким именно образом проблема разрешилась сам точно не могу, но ситуация изменилась когда объект класса ObjectOutputStream стал объявлять до объекта ObjectInputStream. Теперь же суть проблемы вот в чём - клиент должен постоянно находиться в состоянии ожидания входящих сообщений, то есть должен быть цикл, что-то вроде этого:
| Код | Socket s = new Socket(cw.ip.getText(), 3512);
ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream()); ObjectInputStream in = new ObjectInputStream(s.getInputStream());
Message m = new Message(0);
...
while (s.isConnected()) { try { m = (Message) in.readObject(); // обработка входящих сообщений } catch (ClassNotFoundException e) { e.printStackTrace(); } }
|
Но как раз в этом месте программа виснет и не подаёт признаков жизни. Что делать не знаю, ведь на сервере реализация ожидания сообщений аналогичная и работает превосходно. Причём сервер не виснет и если объект ObjectInputStream объявлять раньше ObjectOutputStream
| Код | ServerSocket s = new ServerSocket(port); Socket incoming = s.accept();
ObjectInputStream in = new ObjectInputStream(incoming.getInputStream()); ObjectOutputStream out = new ObjectOutputStream(incoming.getOutputStream());
.......
while (incoming.isConnected()) { try { Message mess = (Message) in.readObject(); // обработка входящих сообщений } catch (ClassNotFoundException e) { e.printStackTrace(); } }
|
Подскажите, пожалуйста, что делать, заранее спасибо! |