Клиент и сервер обмениваются данными через два потока (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);
}
}
Возможно. Невозможно сказать, так как вы не указали код сервера. –
Хорошо, я добавил код сервера. – Yuri
Сколько объектов ObjectOutputStreams у вас есть на сервере? –