This question already has an answer here:
StreamCorruptedException: invalid type code: AC

(1个答案)


4年前关闭。




我正在写应该在线玩的游戏。我有一个服务器,每次客户端连接时都会启动新的Thread。然后,客户端使用ThreadObjectInputStream与该ObjectOutputStream通信。在这种通信中,客户可以开始新游戏或选择现有游戏加入。如果客户端加入现有游戏,则服务器将使用该游戏实例启动一个新的Thread,并且该游戏实例应开始与客户端的自身通信。我将Sockets传递给该游戏实例,但是当我尝试向客户端发送一些消息时,只有其中一个可以正确接收该消息。第二个客户端引发异常java.io.StreamCorruptedException: invalid stream header: 79ACED00
我使用相同的方法发送消息,因此我不知道为什么它对一个客户端有效,为什么对第二个客户端无效。

这是创建游戏实例的代码:

GameInstanceDescription joined_game = (GameInstanceDescription) response;
joined_game.setSocket_challenger(socket_from_client);
joined_game.setChallenger(rcvd_msg.getChallenger());
joined_game.setSocket_promoter(game_server.getPromotersSocket(joined_game.getName()));
game_server.startNewGame(joined_game);


在最后一行之后,Thread应该结束。

这是服务器方法:

public void startNewGame (GameInstanceDescription desc)
{
    Thread t = new Thread(new MainGame(desc));
    t.start();
}


这是用于从游戏实例向客户端发送消息的方法:

public void sendMessageToClient(ServerToClientMessage message, ObjectOutputStream stream)
{
    try {
        stream.writeObject(message);
        stream.flush();
        stream.reset();
    } catch (IOException e) {
        e.printStackTrace();
    }
}


这是应该从服务器读取消息的客户端代码,但是它仅适用于一个客户端,并且在此处引发了异常:

input = new ObjectInputStream(client.getInputStream());
Object o = input.readObject();


我在互联网上找不到任何有用的方法来解决此问题,所以请您告诉我哪里出了问题?
提前致谢。

最佳答案

不要在每次读取一个对象时创建一个新的ObjectInputStream(或每次写入一个对象都创建一个新的ObjectOutputStream)。在套接字的生存期内使用相同的流。

07-24 09:37
查看更多