簡體   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