gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 18:20:44 25 4
gpt4 key购买 nike

我有另一个套接字问题。与我的其他问题相比,这实际上很奇怪。好的,我有一个连接到服务器的客户端,该服务器通过 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;
}
}

服务器接收更新的坐标并打印之前和之后的位置:

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);

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

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...

哎呀,我什至会显示从服务器发送到客户端的包,其中包含列表:

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;
}
}

我的整个问题是,更新的坐标在服务器端的玩家列表中,但是一旦将列表发送到客户端,更新的数据就不再更新了……和之前一样过程开始了。这是套接字如何工作的问题,还是我只是可怕地陷入了一个小错误? List 不是问题,因为我用它交换了一组 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);
}

最佳答案

请确保您是否将相同的对象引用重复传递给 ObjectOutputStream 的单个实例,这表明您正在使用 ObjectOutputStream.writeUnshared(Object)这样做或调用 ObjectOutputStream.reset()在该对象的写入之间。

如果您不这样做,ObjectOutputStream 将看到该对象已写入并写入对先前序列化形式的引用,而不是您第一次写入时对象的序列化状态.

关于Java:列表未正确通过套接字发送?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11942312/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com