【问题标题】:StreamCorruptedException: invalid type code: 00StreamCorruptedException:无效类型代码:00
【发布时间】:2012-05-14 09:43:57
【问题描述】:

服务器代码:

while (true) {                                  
    Socket sock = serv.accept(); 
    try {
        new ClientSession(sock, outQueue, activeSessions);
        System.out.println("CS");
    } catch (IOException e) {
        System.out.println("Sock error");
        sock.close();
    }
}

客户端会话:

class ClientSession extends Thread {
private Socket socket;
private OutboundMessages outQueue;
private ActiveSessions activeSessions;
private ObjectInputStream netIn;
private ObjectOutputStream netOut;
int n = 0;
boolean inGame = false;
boolean ready = false;
Player p;

public ClientSession(Socket s, OutboundMessages out, ActiveSessions as)
        throws IOException {
    socket = s;
    outQueue = out;
    activeSessions = as;
    netOut = new ObjectOutputStream(socket.getOutputStream());
    netOut.flush();
    netIn = new ObjectInputStream(socket.getInputStream());
    System.out.println("ClientSession " + this + " starts...");
    while (true) {
        Object nameMsg = null;
        try {
            nameMsg = netIn.readObject();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        if (nameMsg instanceof NameMessage) {
            this.setName(((NameMessage) nameMsg).name);
            break;
        }
    }
    start();
}

public void run() {
    try {
        activeSessions.addSession(this);
        while (true) {
            Object inMsg = null;
            try {
                try {
                    inMsg = netIn.readObject();
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (inMsg instanceof ReadyMessage) {
                ready = true;
            } else if (inMsg instanceof DirMessage) {
                p.setDir(((DirMessage)inMsg).dir);
            }

        }
    } finally {
        try {
            socket.close();
        } catch (IOException e) {
        }
    }
}

public void sendMessage(Message msg) {
    try {
        if (!socket.isClosed()) {
            netOut.writeObject(msg);
            netOut.flush();
        } else {
            throw new IOException();
        }
    } catch (IOException eee) {
        try {
            socket.close();
        } catch (IOException ee) {
        }
    }
}

在客户端创建输入和输出:

public void connect() {
    try {
        InetAddress serverAddr = InetAddress.getByName(serverName);
        try {
            System.out.println("Connecting with "
                    + serverAddr.getHostName() + ":" + port);
            socket = new Socket(serverAddr, port);

            try {
                System.out.println("Connected to "
                        + serverAddr.getHostName());
                netOut = new ObjectOutputStream(socket.getOutputStream());
                netOut.flush();
                netIn = new ObjectInputStream(socket.getInputStream());
                netOut.writeObject(new NameMessage(name));
                netOut.flush();
            } finally {

            }

        } catch (ConnectException e) {
            System.out.println("Cannot connect to server");

        } catch (IOException e) {
            System.out.println("Input error");
        }

    } catch (UnknownHostException e) {
        System.out.println("Unknown server: " + e.getMessage());
    }
}

客户端的接收器:

public void run() {
    while (true) {
        Object a = null;

            try {
                a = netIn.readObject();
                netIn.reset();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

        if (a != null && a instanceof CoordMessage) {
            setXY((CoordMessage)a);
        }
    }
}

堆栈跟踪:

java.io.StreamCorruptedException: invalid type code: 00
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at twoPlayerClient.Receiver.run(Receiver.java:28)

创建输入和输出后,我不断将它们传递给其他类,而不是创建新类。

我已经阅读了其他类似的问题,但无法找到为什么这种情况不断发生的答案。

【问题讨论】:

  • 而且不像看起来那么 OT,你不应该在 ClientSession 的构造函数中做任何 I/O,包括构造流。您必须在 run() 方法中完成所有操作。否则你会阻塞在 accept() 循环中,这会对其他客户端产生不利影响。
  • 那里似乎有一些虚假的方法调用。 ObjectInputStream 不支持 reset。创建流后无需直接flush(尽管它不应该造成任何伤害)。除此之外,我建议进行单元测试(并提高代码质量以便对其进行单元测试)。
  • 我解决了这个问题,只从服务器发送对象,客户端发送适合我需要的字符串。

标签: java exception serialization stream


【解决方案1】:
 new ClientSession(sock, outQueue, activeSessions);

我认为,每个客户端都有一个新会话,因此您不能使用具有全局范围的流变量。因为它也被其他会话线程使用。

【讨论】:

    猜你喜欢
    • 2011-01-24
    • 2021-02-08
    相关资源
    最近更新 更多