Проблема с клиентской программой чата - PullRequest
0 голосов
/ 01 февраля 2011

У меня есть серверный чат и клиентские программы чата, работающие на localhost.Когда я пытаюсь подключиться к серверу, моя клиентская программа зависает на следующей строке in = new ObjectInputStream(socket.getInputStream());, вот фрагмент кода, где я пытаюсь подключиться к серверу

            Socket socket = new Socket(host, port);
            try {
                out = new ObjectOutputStream(socket.getOutputStream());
                in = new ObjectInputStream(socket.getInputStream());
                Message m = new Message(null, nick, Message.Type.REGISTER);
                out.writeObject(m);
                out.flush();
            } catch (IOException ex) {
                socket.close();
                throw ex;
            }

Класс сообщений реализует интерфейс Serializable, поэтому он можетбыть сериализованным по сети.А вот фрагмент кода, в котором серверный запрос клиента клиента

try {
            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(client.getInputStream()));
            Message m = (Message) in.readObject();
            switch (m.getMessageType()) {
                case REGISTER:
                    registerUser(m);
                    break;
                case CHATMESSAGE:
                    sendMessageToAll(m);
                    break;
                case UNREGISTER:
                    unregisterUser(m);
                    break;
            }
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Chatserver.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Chatserver.class.getName()).log(Level.SEVERE, null, ex);
        }

методов registerUser, unregisterUser, sendMessageToAll просто вызывает следующий метод

private void sendMessage(Message m, Socket s) throws IOException {
        ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(s.getOutputStream()));
        out.writeObject(m);
        out.flush();
       // out.close();
    }

Где ошибка?

Ответы [ 2 ]

1 голос
/ 01 февраля 2011

Кажется, что проблема может быть такой же, как описанная здесь .

0 голосов
/ 08 марта 2012

Только что столкнулся с этой проблемой .. Так что дайте ответ в самой теме:

ObjectOutputStream записывает заголовок потока при его создании (новый ObjectOutputStream (out))

Аналогично, ObjectInputStream, когда мы его создаем (новый ObjectInputStream (in)), пытается прочитать тот же заголовок из соответствующего ObjectOutputStream на стороне сервера

Здесь, в клиенте,

in = new ObjectInputStream(socket.getInputStream());

ObjectInputStream создавал блоки при попытке прочитать заголовок потока, который не будет получен, поскольку на сервере нет соответствующего ObjectOutputStream, который будет записывать заголовок клиенту.

Проблема не только в этом. Если создание ObjectOutputStream на одной стороне совпадает с некоторыми другими операциями чтения на стороне клиента, которые должны считывать что-то по нашему выбору, он может прочитать заголовок потока вместо фактического значения и в результате получить неправильное значение.

Решение: ObjectOutputStream и ObjectInputStream, созданные на стороне клиента и сервера, должны быть выровнены друг с другом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...