繁体   English   中英

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

[英]Java: List not being sent over socket correctly?

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

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将看到该对象已被写入,并写入对先前序列化形式的引用,该引用将是您首次编写该对象时该对象的序列化状态。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM