2013-11-30 2 views
1

Клиент и сервер обмениваются данными через два потока (ObjectOutputStream, ObjectInputStream);Многопользовательская игра (Java-сокет java.io.StreamCorruptedException: недопустимый код типа: 00)

Многопоточный сервер отправляет данные игроков каждую секунду для синхронизации клиента с сервером. И данные о каждом действии игроков отправляются клиентам.

В этом цикле клиент получает данные и решает, что с ними делать. И иногда в этой строке есть ошибка Object data = in.readObject();

Я думаю, что ошибка возникает, когда два потока на сервере в то же время пытаются отправить данные клиенту. Это правда?

while(true) { 
    Object data = in.readObject(); 
    if (data instanceof ControlShareData) { 
     ControlShareData c = (ControlShareData)data; 
     if (c.playerId == Game.player.id) { 
      Game.player.keyChange(c); 
     } 
     else { 
      for (Player p: Game.enemies) { 
       if (c.playerId == p.id) { 
        p.keyChange(c); 
       } 
      } 
     } 
    } 
    else if (data instanceof ShareData) { 
     ShareData sd = (ShareData)data; 

     Game.syncing(sd); 
    } 
} 

стороне сервера выглядит следующим образом:

первая нить: (EXEC каждый второй для всех клиентов)

p.out.writeObject(new ShareData(players, Wrd.boxes)); 
p.out.flush(); 

и игроков нить (один игрок - один поток):

public void sendInfoAboutKey(int keyCode, boolean value) { 
    try { 
     for (Player p: Game.players) { 
      p.out.writeObject(new ControlShareData(keyCode, value, id)); 
      p.out.flush(); 
     } 
    } catch (IOException e) { 
     Server.removePlayer(this); 
    } 
} 
+0

Возможно. Невозможно сказать, так как вы не указали код сервера. –

+0

Хорошо, я добавил код сервера. – Yuri

+0

Сколько объектов ObjectOutputStreams у вас есть на сервере? –

ответ

0

Да, вы правы - для решения этой проблемы вы можете синхронизировать свой доступ к каждому ObjectOutputStream. Кстати, к одному клиенту должен быть только один.

+0

Правильное решение - сделать очередь для каждого клиента? и добавлять к нему данные из разных потоков для отправки клиенту. – Yuri

+0

Это звучит неплохо, да. Или вы можете использовать JMS. –

+0

Хорошо, спасибо. – Yuri

Смежные вопросы