【问题标题】:Multiplayer game (Java socket java.io.StreamCorruptedException: invalid type code: 00)多人游戏(Java 套接字 java.io.StreamCorruptedException:无效类型代码:00)
【发布时间】:2013-11-30 21:58:29
【问题描述】:

客户端和服务器通过两个流(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 sockets objectinputstream


【解决方案1】:

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

【讨论】:

  • 正确的解决方案是为每个客户创建一个队列吗?并将来自不同线程的数据添加到它以发送到客户端。
猜你喜欢
  • 2021-02-08
  • 1970-01-01
  • 1970-01-01
  • 2012-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多