0

この質問を数回見たことがありますが、正直なところ、それを機能させる方法がわかりません。クライアントとサーバーのアプリケーションがあり、サーバーには ObjectOutputStream 変数があり、2 倍の整数配列を含む配列リストを送信します (これは、オブジェクトを送信する必要があるためであり、通常の配列は使用できないためです)。オブジェクトの場合、送信できるように配列リストにラップします)。クライアントは ObjectInputStream 変数を使用してそれを受け取りますが、double 配列がその数値を変更したとしても、配列リスト オブジェクトの最初のインスタンスしか受け取りません。送信するオブジェクトを更新するにはどうすればよいですか? ObjectInputStream が毎回新しいオブジェクトを受け取るようにするにはどうすればよいですか?

-ダン

サーバ:

public class Send extends Thread{
     Starter start;
     PlayerArray array;
     Names name;
     public Send(Starter start, PlayerArray array, Names name){
         this.start = start;
         this.array = array;
         this.name = name;
     }
     public void run(){
         while(start.running){
             for(int i = 0; i < start.roomNum; i++){
                 if(start.send[i] != null && start.OOS[i] != null){
                      try{
                          array.setSendingArray(i);
                          start.OOS[i].writeObject(array.get());
                          start.OOS[i].flush();
                      }catch(Exception e){

                      }
                }
             }
         }
    }
}

サーバー プレーヤー配列クラス: (クライアントと同じ):

public class PlayerArray{
Starter start;
int[][] players;
int[][] sending;
public PlayerArray(Starter start){
    this.start = start;
    players = new int[start.roomNum][2];
    defaultArray();
}
public int[][] getArray(){
    return players;
}
public ArrayList<int[][]> get(){
    ArrayList<int[][]> xyWrap = new ArrayList<int[][]>();
    xyWrap.add(sending);
    return xyWrap;
}
public void set(int[][] xy){
    players = xy;
}
public void set(int index, int newX, int newY){
    players[index][0] = newX;
    players[index][1] = newY;
}
public void setSendingArray(int i){
    //take out "i"'s x and y.
    sending = players;
    //sending[i][0] = -1;
    //sending[i][1] = -1;
}
public void defaultArray(){
    for(int i = 0; i < start.roomNum; i++){
        players[i][0] = -1;
        players[i][1] = -1;
    }
    sending = players;
}

クライアント:

public class Recieve extends Thread{
Starter start;
PlayerArray array;
Names name;
public Recieve(Starter start, PlayerArray array, Names name){
    this.start = start;
    this.array = array;
    this.name = name;
}
public void run(){
    while(start.running){
        try{
            ArrayList<int[][]> xy = new ArrayList<int[][]>();
            xy = (ArrayList<int[][]>)start.OIS.readObject();
            array.set(xy.get(0));
            int[][] testXY = array.getArray();
            System.out.println("X:  " + testXY[0][0] + "  Y:  " + testXY[0][1]);
        }catch(Exception e){
            System.err.println("CANNOT READ OBJECT!");
        }
    }
}
}
4

1 に答える 1

1

オブジェクトをシリアル化すると、各参照がトークンに置き換えられます。これは、同じオブジェクトを 2 回参照したり、2 つのオブジェクトが相互に参照したりした場合でも、オブジェクトを正しく (デ) シリアル化することを意味します。

という意味でもあります

  • 両端には、送受信したすべてのオブジェクトのキャッシュがあり、メモリ リークの原因となる可能性があります。
  • オブジェクトを更新して再度送信すると、変更に「気付かず」、元のデータへの参照が取得されます。同様に、逆シリアル化したオブジェクトを変更すると、変更しても同じ参照が取得されます。

reset()ObjectOutputStream で呼び出すことである両方の問題に対する解決策があります。これにより、キャッシュがクリアされ、オブジェクトがメモリを消費するのを防ぎ、既に送信されたオブジェクトを強制的に送信して、もう一度送信することができます。

于 2013-01-27T17:39:28.317 に答える