客户端和服务器通过两个流(ObjectOutputStream,ObjectInputStream)进行通信;

多线程服务器每秒发送播放器的数据,以使客户端与服务器同步。并且有关每个玩家动作的数据都发送给客户端。

在此循环中,客户端接收数据并决定如何处理它们。
有时此行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);
    }
}


服务器端看起来像这样:

第一个线程:(每秒对所有客户端执行一次)

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);
    }
}

最佳答案

是的,您是正确的-要解决此问题,您可以同步访问每个ObjectOutputStream。顺便说一句,每个客户只能有一个。

关于java - 多人游戏(Java套接字java.io.StreamCorruptedException:无效的类型代码:00),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20306138/

10-08 22:05