java.io.StreamCorruptedException : invalid stream header: 00000001

标签 java exception file-io multiplayer

我不断收到此异常:

java.io.StreamCorruptedException: invalid stream header: 00000001

服务器端我用它来发送和接收 int,工作正常。

服务器:

new DataOutputStream(player1.getOutputStream()).writeInt(P1);

客户:

dataFromServer = new DataInputStream(socket.getInputStream());
dataFromServer.readInt();

但是当我尝试发送一个对象时,像这样,它会给出错误。

服务器:

new ObjectOutputStream(player2.getOutputStream()).writeObject(gameCrossword);

客户:

objectFromServer = new ObjectInputStream(socket.getInputStream());
crossword = (Crossword)objectFromServer.readObject();

任何帮助都会很好。这是我在游戏开始前发送的填字游戏

根据 jtahlborn 的建议,我将代码更改为仅使用对象流而不是数据流

服务器

player1 = serverSocket.accept();

serverLog.append(new Date() + ": Player 1 joined session " + sessionNo + '\n');
serverLog.append("Player 1's IP address" + player1.getInetAddress().getHostAddress() + '\n');

new ObjectOutputStream(player1.getOutputStream()).writeInt(P1);
new ObjectOutputStream(player1.getOutputStream()).writeObject(gameCrossword);

player2 = serverSocket.accept();

serverLog.append(new Date() + ": Player 2 joined session " + sessionNo + '\n');

serverLog.append("Player 2's IP address" + player2.getInetAddress().getHostAddress() + '\n');

new ObjectOutputStream(player2.getOutputStream()).writeInt(P2);
new ObjectOutputStream(player2.getOutputStream()).writeObject(gameCrossword);

客户端

              private void connectToServer() {

    try {
        Socket socket = new Socket(host, 8000);
        objectFromServer = new ObjectInputStream(socket.getInputStream());
        objectToServer = new ObjectOutputStream(socket.getOutputStream());

    } catch (IOException ex) {
        System.err.println(ex);
    }

    Thread thread = new Thread(this);
    thread.start();
}

@Override
public void run() {

    try {
        player = objectFromServer.readInt();
        crossword = (Crossword)objectFromServer.readObject();
        System.out.println(crossword);

问候, C.

最佳答案

不要用多个输入/输出流包装套接字流。这会以各种不好的方式破坏。在这种特定情况下,ObjectInputStream 在构造时从流中读取 header ,这是在从流中读取 int 之前发生的。不管怎样,只需使用单个 ObjectOutputStream 和 ObjectInputStream 并放弃数据流(请注意,ObjectOutputStream 有一个 writeInt 方法)。

关于java.io.StreamCorruptedException : invalid stream header: 00000001,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20773657/

相关文章:

java - 如何在 Jackson 编码(marshal)期间在 Apache Camel 路由中捕获 JsonParseException?

c# - 指定的初始化向量 (IV) 与该算法的 block 大小不匹配

c++ - 在 C++ 中读入数组

java - 禁用 Tomcat 中所有默认的 HTTP 错误响应内容

java - 如何获得自定义 Eclipse 产品的 Java 视角

c# - 处理 "application not found"等特定 Win32 异常的最佳方法是什么?

Java I/O 文件流问题

string - 寻找改进我的刽子手代码的方法

在 Fedora 16 上启动新安装的 Eclipse 时出现 java 错误

java - Unity3D - 使用 Gradle 构建 Android AppBundle 失败