Java:列表没有通过套接字正确发送?

Cod*_*ler 2 java sockets client list object

我有另一个套接字问题.与我的其他问题相比,这实际上相当奇怪.好的,我有一个客户端连接到服务器,该服务器通过ObjectOutputStream以恒定速率发送数据,并通过ObjectInputStream接收数据.我有一个列有播放器对象的列表,其中包含玩家坐标,游戏模式等.当客户端移动其播放器时,更新的坐标将被发送到服务器,并更新列表中该播放器的对象.好吧,应该更新...我打印出服务器端更改的坐标,但是当我将列表发送到播放器打印出来时,坐标没有改变.这是玩家类:

public static class Player implements Serializable {
    private static final long serialVersionUID = 8841477887428285969L;
    public int x, y, gamemode, ID;
    public String name;
    public Player(int x, int y, int gamemode, int ID, String name) {
        this.x = x;
        this.y = y;
        this.gamemode = gamemode;
        this.ID = ID;
        this.name = name;
    }

    public void setPosition(int x, int y) {
        this.x = x;
        this.y = y;
    }
}
Run Code Online (Sandbox Code Playgroud)

服务器接收更新的坐标并打印前后输出:

Package.Client_Server main_packet = (Package.Client_Server) obj;
System.out.println(S00.getPlayerByID(ID).x + ", " + S00.getPlayerByID(ID).y);
S00.getPlayerByID(ID).setPosition(main_packet.x, main_packet.y);
System.out.println(S00.getPlayerByID(ID).x + ", " + S00.getPlayerByID(ID).y);
Run Code Online (Sandbox Code Playgroud)

这是客户端打印出自己从服务器发送的坐标的地方. 问题出在这里......更新的坐标不会显示在此处,但仍然是旧的坐标.难道我做错了什么?List仍然只有一个对象,所以它不仅仅是在某个地方创建更多的对象......

Package.Server_Client main_packet = (Package.Server_Client) obj;
ID = main_packet.client_ID;
C00.players = main_packet.players;
System.out.println(C00.players.get(ID).x + ", " + C00.players.get(ID).y);
System.out.println(main_packet.players.get(ID).x + ", " + main_packet.players.get(ID).y); 
//I tried printing the list directly from the package as well but it isn't updated either...
Run Code Online (Sandbox Code Playgroud)

哎呀,我甚至会显示从服务器发送到客户端的包,该列表保存在:

public static class Server_Client implements Serializable {
    private static final long serialVersionUID = 5198487406288606819L;
    public int client_ID;
    public int online;
    public List<Player> players;
    public Server_Client(int client_ID, int online, List<Player> players) {
        this.client_ID = client_ID;
        this.online = online;
        this.players = players;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的整个问题是更新的坐标位于服务器端的播放器列表中,但是一旦将列表发送到客户端,更新的数据就不再更新......它与整个过程开始之前的相同.这是套接字如何工作的问题,还是我只是可怕地陷入一个小错误?列表不能成为问题,因为我将它交换为一个Player对象数组,但它仍然无法在客户端正确读取.救命?

编辑:也可以看到此效果,因为当另一个客户端连接到服务器时,客户端1无法看到客户端2,因为列表未更新,但客户端2可以看到客户端1,因为他第一次连接到服务器时.客户端1的控制台总是说他是唯一连接的玩家(列表中有1个项目),而控制台2总是说连接了2个玩家(即使客户端1已断开连接).因此,列表未更新.那会是什么导致这个?

这是方法'getPlayerByID(int ID)':

public static Package.Player getPlayerByID(int ID) {
    for(int i = 0; i < players.size(); i++) {
        if(players.get(i).ID == ID) {
            return players.get(i);
        }
    }
    throw new NoSuchElementException("No player has the ID: " + ID);
}
Run Code Online (Sandbox Code Playgroud)

Dev*_*Dev 7

确保将相同的对象引用传递给ObjectOutputStream您正在使用的单个重复实例,ObjectOutputStream.writeUnshared(Object)或者ObjectOutputStream.reset()在该对象的写入之间调用.

如果你没有这样做,ObjectOutputStream它将看到已经写入的对象并写入对先前序列化表单的引用,而不是第一次编写时对象的序列化状态.