1

ServerSocket/Socket 経由で Java SE 7 を使用して簡単なチャット プログラムを作成しています。クライアントからサーバーへ、またはその逆に送信されたモデル/エンティティ内のデータの不一致が発生する可能性があるかどうか疑問に思っていましたか? その結果、含まれるデータが異なる同じクラスタイプを送信すると、クライアントの送信モデルからサーバーへのデータの不一致が発生します。

Example
Client: Sending...  ID: 3
Server: Received... ID: 3
Client: Sending...  ID: 4
Server: Recieved... ID: 3

ここで私のモデル/エンティティの一般的なパラダイム:

abstract class Record<T> extends Observable implements Serializable {
   // with generated "serialVersionUID" by the EclipseIDE[Juno]
   protected int id;
   // Constructor, Getters/Setters, Abstract methods
   // hashCode(): Generated by Eclipse
   // equals(): Generated by Eclipse, replacing Record with Record<T>
}
abstract class RecordVersion<T> extends Record<T> implements Serializable {
   // with generated "serialVersionUID" by the EclipseIDE[Juno]
   protected int version;
   // Constructor, Getters/Setters, Abstract methods
   // hashCode(): Generated by Eclipse
   // equals(): Generated by Eclipse, replacing RecordVersion with RecordVersion<T>
}
class SampleRecord extends RecordVersion<SampleRecord> {
   // with generated "serialVersionUID" by the EclipseIDE[Juno]
   private String data;
   // Constructor, Getters/Setters, Abstracted methods
   // hashCode(): Generated by Eclipse
   // equals(): Generated by Eclipse
}

これを解決する方法はありますか?ありがとう。

更新 1:

socket.getInputStream()ビアの読み取りjava.io.ObjectInputStream

class ReadRunnable implements Runnable {
  private Object lastObjectReceived = new Object();
  @Override
  public void run() {
    while(true) {
       try {
         // inStream: java.io.ObjectInputStream
         Object objectReceived = inStream.readObject();       
         if(objectReceived .equals(lastObjectReceived ))
           objectReceived = inStream.readObject();
         else
           lastObjectReceived = objectReceived;
       } catch(Exception e) {
         ex.printStackTrace();
       }
    }
  }
}
4

1 に答える 1

2

同じ ObjectOutputStream を介して同じオブジェクト インスタンスを複数回送信しようとすると、問題が発生します。これは、オブジェクト ストリームがオブジェクト ID を保持するためです。同じオブジェクト インスタンスを新しいデータで再送信するには、その間に呼び出す必要がありますObjectOutputStream.reset()

また、あなたのループでは、送信されたオブジェクトの 1 つを「失っています」。ifブロック呼び出しの最初の分岐、.readObject()次に while ループ呼び出しの先頭が.readObject()再び呼び出され、比較する前に前の呼び出しの結果が破棄されます。

于 2012-12-20T18:17:32.607 に答える