【问题标题】:StreamCorruptedException for Server-Client app服务器-客户端应用程序的 StreamCorruptedException
【发布时间】:2013-05-22 20:40:20
【问题描述】:

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

@Override
public void run() {

    Socket client = null;
    MessageListener listener = null;

    try {
        client = server.accept();
        oos = new ObjectOutputStream(client.getOutputStream());
        ois = new ObjectInputStream(client.getInputStream());
        listener = new MessageListener(ois);
        (new Thread(listener)).start();

    } catch (IOException e) {
        e.printStackTrace();
    }
}

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

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 时的一般问题似乎是人们为单个套接字打开多个InputStreamsOutputStreams,但我没有这样做。任何帮助将不胜感激。

【问题讨论】:

    标签: java sockets inputstream outputstream


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      您创建的那些ObjectInputStreamObjectOutputStream 变量应该是方法的本地变量,而不是周围类的成员。事实上,这两个流都应该在您即将启动的线程的run() 方法中构造,而不是在accept() 循环中内联。否则你可能会在错误的地方阻塞。并且ObjectOutputStream 应该始终在ObjectInputStream 之前构造,以防止死锁。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 不是真的,因为我只有一个项目,我在启动时选择将其作为服务器或客户端启动。此外,我在发送简单字符串时也遇到了同样的问题。
        • 这不是serialVersionUID 的问题,如果这就是你所说的那么晦涩的话。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多