повторное использование потоков сокетов - PullRequest
1 голос
/ 04 апреля 2011

У меня есть сокет сервера, который я настраиваю, и сокет клиента, который подключается к сокету сервера.

В следующей последовательности:

  1. Я открываю ObjectOutputStream от клиента к серверу
  2. На сервере я открываю ObjectInputStream из принятого сокетного соединения от клиента
  3. На сервере я открываю ObjectOutputStream, используя принятое сокетное соединение от клиента
  4. На клиенте я открываю ObjectInputStream

Все работает без ошибок. В цикле на сервере у меня следующее

while(true) {
Map<Integer,Game> games = GameEngine.getGames();
System.out.println("Games is: " + games + " size is " + games.size());
secondaryOutputStream.writeObject(games);
secondaryOutputStream.flush();
// sleep for 2 seconds then send the games again
try {
    Thread.currentThread().sleep(4000);
} catch (InterruptedException ie) {
    ie.printStackTrace();
}

}

secondOutputStream - это ObjectOutputStream от сервера к клиенту. Здесь я пишу карту клиенту. Я делаю это несколько раз в цикле, как вы можете видеть, используя один и тот же ObjectOutputStream.

Нет никаких исключений, поэтому все соединения звуковые. Однако на стороне клиента я получаю карту только один раз, после того как сокет-соединение установлено с сервером. Если карта обновляется и записывается на клиент, я все еще вижу исходные значения карты, когда сервер first записал карту на клиент. Можете ли вы использовать объектные потоки таким образом? Спасибо действительно

1 Ответ

6 голосов
/ 04 апреля 2011

ObjectOutputStream имеет функцию экономии места (и сохранения идентичности), где он отслеживает объекты, отправленные ранее (на основе идентичности объекта), и не отправляет их повторно. вместо этого он просто отправляет маркер, который указывает, какой объект был ранее отправлен, а ObjectInputStream (который сохраняет дескриптор всех отправленных объектов) просто возвращает этот объект на другом конце. вам нужно использовать ObjectOutputStream.reset() между каждой отправкой, чтобы объект был полностью повторно отправлен. Вы также можете использовать ObjectOutputStream.writeUnshared(), но это может работать не так, как вам нужно.

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