Java 服务器客户端应用程序的StreamCorruptedException

Java 服务器客户端应用程序的StreamCorruptedException,java,sockets,inputstream,outputstream,Java,Sockets,Inputstream,Outputstream,我的服务器在一个线程中运行这段代码,这样我就可以在等待客户端连接时与GUI交互(目前我只使用一个客户端和一个服务器) 我的客户端运行此代码一次以连接到服务器并修复输入/输出流: try { ois = new ObjectInputStream(server.getInputStream()); MessageListener listener = new MessageListener(ois); oos = new ObjectOutputSt

我的服务器在一个线程中运行这段代码,这样我就可以在等待客户端连接时与GUI交互(目前我只使用一个客户端和一个服务器)

我的客户端运行此代码一次以连接到服务器并修复输入/输出流:

try {
        ois = new ObjectInputStream(server.getInputStream());
        MessageListener listener = new MessageListener(ois);
        oos = new ObjectOutputStream(server.getOutputStream());
        (new Thread(listener)).start();
    } catch (IOException e) {
        e.printStackTrace();
    }
MessageListener运行一个线程来检查是否输入消息

@Override
public void run() {
    while (true) {
        Message message = null;
        try {
            message = (Message) in.readObject();
            if (message != null) {
                System.out.println(message.getName());
            }
        } catch (ClassNotFoundException | IOException e) {
            e.printStackTrace();
        }

    }
}
然而,当我启动我的程序时,一开始我只能从服务器发送到客户端,而不能从服务器发送到客户端(我只是不能与客户端GUI交互)。 从服务器向客户端发送第一条消息后,我收到以下错误消息:

java.io.StreamCorruptedException: invalid type code: 6F
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at com.jale.chat.iohandling.MessageListener.run(MessageListener.java:25)
at java.lang.Thread.run(Unknown Source)
编辑:在我收到第一条错误消息后,我只能从客户端发送到服务器(发送实际上有效),但错误消息不断地向我的控制台发送垃圾邮件

MessageListener的第25行:

message = (Message) in.readObject();

在google/Stack Overflow上没有发现任何东西,因为获取
StreamCorruptedException
时的一般问题似乎是当人们为单个套接字打开多个
InputStreams
OutputStreams
时,但我没有这样做。非常感谢您的帮助。

嗯,您必须为客户端/服务器端使用相同的类(带id)。我已经将我的消息机制放入了用于两个客户机/服务器项目的库中。此外,如果我编译服务器/客户端,我会编译所有三个项目。。。也许这会有所帮助。

您正在构建
ObjectOutputStreams
,然后将它们扔掉。它们应该被传递给
MessageListener
的构造函数,就像
ObjectInputStreams一样,
这样每个客户端都可以使用有效的东西来编写。您不可能像现在这样正确地向对等方写入代码。可能您在某处为错误的对等方重用了
ObjectOutputStream


您正在创建的
ObjectInputStream
ObjectOutputStream
变量应该是方法的本地变量,而不是周围类的成员。事实上,这两个流都应该在即将启动的线程的
run()
方法中构造,而不是内联在
accept()
循环中。否则,您可能会在错误的位置阻塞。而且
ObjectOutputStream
应该总是在
ObjectInputStream
之前构造,这样就不可能出现死锁。

我认为您可能多次打开了输入/输出流。尝试检查connect函数是否只被调用一次。

不太可能,因为我只有一个项目在启动时选择作为服务器还是客户端启动它。此外,我在发送简单字符串时也遇到了同样的问题。这不是
serialVersionUID
问题,如果这正是你所说的那么模糊的话。
message = (Message) in.readObject();