【问题标题】:Java invalid stream header [duplicate]Java无效的流标头[重复]
【发布时间】:2015-03-15 16:21:52
【问题描述】:

我正在编写一个应该在线玩的游戏。我有一个服务器,每次客户端连接时都会启动新的Thread。然后客户端使用ObjectInputStreamObjectOutputStream 与这个Thread 通信。在此通信中,客户可以开始新游戏或选择现有游戏加入。如果客户端加入现有游戏,服务器会与游戏实例启动一个新的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();

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

【问题讨论】:

  • BroadCast Messenger in Java搜索,你会发现很多东西

标签: java sockets stream


【解决方案1】:

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

【讨论】:

  • 是否可以将这些流传递给另一个Thread?因为我想我试过了,但它也以无效的流标头异常告终。但可能还有其他错误。
  • 只有在构造ObjectInputStream.时才会得到这个消息
  • 问题解决了,我重写了我的程序的一些部分,它现在可以工作了。我将 Streams 传递给另一个线程而不是创建新线程,并且我还更改了其他一些我没有做对的事情,现在可以了。感谢您的帮助..
  • 这对我很有帮助,因为我每次从套接字流中读取数据之前都会创建一个对象流
猜你喜欢
  • 2011-02-07
  • 2015-07-25
  • 2017-10-28
  • 2018-08-03
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多