Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过提供错误大小的套接字读取ArrayList_Java_Sockets_Arraylist - Fatal编程技术网

Java 通过提供错误大小的套接字读取ArrayList

Java 通过提供错误大小的套接字读取ArrayList,java,sockets,arraylist,Java,Sockets,Arraylist,我目前正在开发一个客户机-服务器游戏,当我通过套接字发送ArrayList时遇到了一些问题。 以下是我的应用程序当前的工作方式: 服务器启动 播放器连接到服务器 服务器将玩家添加到玩家列表,并开始渲染地图和更新地图,并将更新发送给连接的玩家 另一个玩家连接 服务器添加此播放器并继续执行相同的操作 当服务器向玩家发送数据时,我所做的只是敌人的数组列表和玩家的数组列表,其他事情并不重要。 所以在我的玩家课上,我有两个阅读对象,玩家和敌人。在我的服务器上,我有两个写,玩家和敌人。 我的主要问题是,当服

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

服务器启动

播放器连接到服务器

服务器将玩家添加到玩家列表,并开始渲染地图和更新地图,并将更新发送给连接的玩家

另一个玩家连接

服务器添加此播放器并继续执行相同的操作

当服务器向玩家发送数据时,我所做的只是敌人的数组列表和玩家的数组列表,其他事情并不重要。 所以在我的玩家课上,我有两个阅读对象,玩家和敌人。在我的服务器上,我有两个写,玩家和敌人。 我的主要问题是,当服务器将播放器的ArrayList发送给2个连接的播放器时,它会显示ArrayList的大小为2(这是正常的,下面是日志:)

我们还可以看到,它将它发送给2个不同的id(连接的玩家)。 这就是我做这件事时得到的结果:

ArrayList<Player> p = (ArrayList<Player>) this.objIn.readObject();
System.out.println(p.size());
和sendPlayer方法:

public void sendPlayer(ArrayList<Player> players) {
    try {
        this.objectOut.writeObject(players);
    } catch (IOException e) {
        e.printStackTrace();
    }
}
public void sendPlayer(ArrayList播放器){
试一试{
this.objectOut.writeObject(播放器);
}捕获(IOE异常){
e、 printStackTrace();
}
}
你们知道我做错什么了吗

谢谢


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

您需要调查
ObjectOutputStream.reset()
。 否则,您将使用相同的值反复读取相同的
对象

    if(this.players.size() > 0) {
        for(GestionPlayer gp : this.players) {
            gp.sendPlayer(this.level.players);
        }
    }
public void sendPlayer(ArrayList<Player> players) {
    try {
        this.objectOut.writeObject(players);
    } catch (IOException e) {
        e.printStackTrace();
    }
}