Java无效的流标头

时间:2015-03-15 16:21:52

标签: java sockets stream

我正在写一款应该在线玩的游戏。我有一台服务器,每次客户端连接时都会启动新的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();

我没有在互联网上找到任何有用的东西可以解决这个问题,所以你能告诉我出了什么问题吗? 提前谢谢。

1 个答案:

答案 0 :(得分:1)

每次阅读一个对象(或每次编写一个新ObjectInputStream时)都不要创建新的ObjectOutputStream。在套接字的生命周期中使用相同的流。