通过套接字读取ArrayList给出不正确的大小

时间:2014-09-03 09:18:40

标签: java sockets arraylist

我目前正在开发客户端服务器游戏,当我通过套接字发送我的ArrayList时,我遇到了一些问题。 这就是我的应用程序当前的工作方式:

服务器启动

播放器连接到服务器

服务器将播放器添加到播放器列表并开始渲染地图并更新它并将更新发送给连接的播放器。

另一位玩家连接

服务器添加此播放器并继续做同样的事情。

当服务器向玩家发送数据时我正在做的只是敌人和玩家的arraylist的arraylist,其他事情并不重要。 所以在我的播放器类中,我有2个读取对象,玩家和敌人。在我的服务器中我有2个写,玩家和敌人。 我的主要问题是,当服务器将播放器的ArrayList发送到2连接的播放器时,它会告诉我ArrayList的大小是2(这是正常的,这是日志:)。

[11:12] 2 to 15
[11:12] 2 to 16
[11:12] 2 to 15
[11:12] 2 to 16
[11:12] 2 to 15
[11:12] 2 to 16

我们还可以看到它将它发送到2个不同的ID(连接的玩家)。 现在这就是我这样做的原因:

ArrayList<Player> p = (ArrayList<Player>) this.objIn.readObject();
System.out.println(p.size());

对于第一个连接的玩家,我有1个大小而第二个我有2个。这基本上意味着一个玩家在交易中丢失了。如果我添加另一个播放器(因此它生成3),同样的事情发生,连接的第一个播放器将具有大小为1的ArrayList,第二个大小为2,最后一个大小为3。 这是我的sendObject代码:

    if(this.players.size() > 0) {
        for(GestionPlayer gp : this.players) {
            gp.sendPlayer(this.level.players);
        }
    }

sendPlayer方法:

public void sendPlayer(ArrayList<Player> players) {
    try {
        this.objectOut.writeObject(players);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

你们知道我做错了吗?

谢谢!

PS:我知道发送带套接字的对象并不好(最好发送原始数据),但我不想在这里争论。

1 个答案:

答案 0 :(得分:0)

您需要调查ObjectOutputStream.reset()。 否则,您将一遍又一遍地使用相同的值继续阅读相同的Object