java - 多人游戏(Java 套接字 java.io.StreamCorruptedException : invalid type code: 00)

标签 java sockets objectinputstream

客户端和服务器通过两个流(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 : invalid type code: 00),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20306138/

相关文章:

java - 如何优化这个解决方案以避免超出时间限制?

node.js - nginx tcp SYN 数据包未收到 ACK

PHP 与 C++ 应用程序的通信

java - ObjectInputStream 的实例

java - 我的代码中的这个错误是什么?尝试将 userinput 用于变量并使用 switch 语句

java - 如何在 Apache Spark 中重置 MapReduce 函数上的迭代器

java - java.io.ObjectInputStream 类型无法解析。它是从所需的 .class 文件中间接引用的

java - 关闭 CipherInputStream 的替代方法

java - 签名算法 : SHA256WithRSAEncryption 上的算法约束检查失败

ios - 使用 Swift 的 TCP 套接字