ObjectInputStream - Как ждать новых данных? - PullRequest
5 голосов
/ 22 февраля 2012

У меня есть клиент-серверное приложение, которое я создаю, и у меня возникают проблемы при чтении объектов на сервере.

После того, как мой сервер подключился к клиентскому сокету, я строю потоки ввода и вывода объектов и передаю их моему методу service(). Там я должен обрабатывать различные виды сообщений от клиента. Я могу получить сообщение от клиента (то есть объект Message моего дизайна) просто отлично. Но, конечно, я хочу сделать цикл, чтобы я мог получить сообщение, обработать его и ответить обратно.

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

Так что мне действительно нужно выяснить, как заставить мой service() метод ожидать нового ввода. Есть идеи? Или я подхожу к этому неправильно? Нужно ли создавать новую OIS на каждой итерации или ...? Какой-то код:

public void service(ObjectInputStream input, ObjectOutputStream output) throws IOException, Exception {

    _shouldService = true;

    while (_shouldService) {
                    // It just keeps reading the same message over and over
                    // I need it to wait here until the client sends a new message
                    // Unless I'm just approaching this all wrong!
        NetworkMessage message = (NetworkMessage) input.readObject();

        NetworkMessageHeader header = message.getHeader();

        String headerType = header.getType();

        if (headerType.equals(NetworkMessageHeader.NetworkMessageHeaderTypeConnect)) {
            doLoginForMessage(message, output);
        } else if (headerType.equals(NetworkMessageHeader.NetworkMessageHeaderTypeFiles)) {
            doFilesList(message, output);
        } else {
            System.out.println("Unrecognized header type: " + headerType);

        }
    }
}

1 Ответ

2 голосов
/ 22 февраля 2012

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

NetworkMessage message = new NetworkMessage();
for(;;) {
  message.setProperty(whatever);
  oos.reset();
  oos.writeObject(message);
}
...