【问题标题】:Reusing ObjectInputStream throws StreamCorruptedException重用 ObjectInputStream 抛出 StreamCorruptedException
【发布时间】:2015-03-06 13:56:37
【问题描述】:

我有一个客户端-服务器应用程序。客户端发送一个对象,服务器返回相同的对象,一个简单的回显服务器。如果我为每个新请求创建一个 Client 的新实例,则下面的代码可以正常工作。但是,如果我使用客户端的现有实例,它会给我一个java.io.StreamCorruptedExceptionjava.lang.ClassCastException

客户

Socket socket = new Socket(hostName, port);


in = new ObjectInputStream(
            new BufferedInputStream(socket.getInputStream()));
out = new ObjectOutputStream(socket.getOutputStream());

//calling this each time I have a new request
out.writeObject(request);
out.flush();
Object object = in.readObject();

服务器

ServerSocket serverSocket = new ServerSocket(port);
Socket clientSocket = serverSocket.accept();
new Thread(new ClientWorker(clientSocket)).start();

客户工作者

public void run() {
        try {
            ObjectOutputStream out =
                    new        ObjectOutputStream(clientSocket.getOutputStream());

            ObjectInputStream in = new ObjectInputStream(
                    new BufferedInputStream(clientSocket.getInputStream()));

            Object inputObject;

      while(true) {
            while ((inputObject = in.readObject()) != null) {
                  out.writeObject(inputObject);
            }

            out.flush();
        }
    } catch (IOException e) {
            e.printStackTrace();
    } catch (ClassNotFoundException e) {
            e.printStackTrace();
    }
}

编辑:

在重用的Client中执行以下代码时

in.readObject();

我得到了异常

java.io.StreamCorruptedException:无效类型代码:00 at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1497) 在 java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1748) 在 java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1327) 在 java.io.ObjectInputStream.readObject(ObjectInputStream.java:349)

【问题讨论】:

  • 对象流很棘手。由于除了对象本身之外还会发送各种标头信息,因此您不能像那样重用它们。
  • 是否检查了各个类的 java 文档以及何时引发此异常?你能指出这些异常发生的地方吗?
  • @bot 我已经指出了他们
  • @Kayaman 那么我需要做什么?
  • @user592748 我建议你不要在网络通信中使用ObjectStreams,而是使用普通的字节流。

标签: java sockets networking inputstream outputstream


【解决方案1】:

在我同步输入和输出对象流后,问题得到解决。

synchronized(this) {
    while ((inputObject = in.readObject()) != null) {
        out.writeObject(inputObject);
    }
}

synchronized(this) {
   out.writeObject(request);
   out.flush();
   Object object = in.readObject();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-13
    • 2021-07-03
    • 1970-01-01
    • 2013-01-09
    • 2013-02-16
    • 1970-01-01
    • 2020-05-03
    相关资源
    最近更新 更多