2016-07-08 14 views
0

私はネットワークを使ってオブジェクトを渡す簡単なプログラムをコーディングしようとしています。オブジェクトには静的データが含まれている可能性があるため、データを受け取った後に静的データがリセットされるため、そのデータをどのように渡すかわかりません。それはどのように可能ですか?ネットワーク経由でオブジェクトの静的データを渡すには?

import java.io.*; 
import java.net.Socket; 

public class client { 
    private static int PORT = 8901; 
    private static Socket socket; 

    public static void main(String[] args) throws Exception{ 
     socket = new Socket("localhost", PORT); 
     dataStruct ds = new dataStruct(); 
     ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream()); 
     dataStruct.khar = 1; 
     oos.writeObject(ds); 
     oos.close(); 
    } 
} 
class dataStruct implements Serializable{ 
    static int khar = 0; 
    public void setData(int khar){ 
     this.khar = khar; 
    } 
} 

これは私のクライアントであり、そして次は私のサーバーです:

import java.io.*; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class test { 
    public static void main(String[] args) throws Exception { 
     ServerSocket listener = new ServerSocket(8901); 
     Game game = new Game(); 
     Game.Player player1 = game.new Player(listener.accept(), 1); 
     player1.start(); 
    } 
} 

class Game { 
    class Player extends Thread { 
     int turn; 
     Player opponent; 
     Socket socket; 
     ObjectInputStream input; 

     public Player(Socket socket, int turn) { 
      this.socket = socket; 
      this.turn = turn; 
      try { 
       input = new ObjectInputStream(socket.getInputStream()); 
      } catch (IOException e) { 
       System.out.println("Player died: " + e); 
      } 
     } 

     public void run() { 
      try { 
       dataStruct ds = (dataStruct)input.readObject(); 
       System.out.println(ds.khar); 
      } catch (Exception e) { 
       System.out.println("Player died: " + e); 
      } finally { 
       try {socket.close();} catch (IOException e) {} 
      } 
     } 
    } 
} 
+0

ご質問はありますか?投稿したコードに間違いがありますか?もしそうなら、それは何ですか? – user1875195

答えて

1

オブジェクトに含まれる静的なデータのようなものはありません。オブジェクト、すなわち、 e。クラスのインスタンスはインスタンスデータのみを持ちます。静的データはクラスに属し、特定のインスタンスには属しません。あなたが独自のシリアライゼーション戦略を使わずにデフォルトを使うだけでJavaのシリアル化メカニズムを使用するならば、もちろんインスタンスをシリアライズしているので静的データは転送されず、静的データはインスタンスに直接関係しません。オブジェクトがインスタンスであるクラスに関連しています。

+0

ありがとう!だから私は自分のいくつかのシリアル化のメカニズムを追加する必要がデータを転送するには? – AHPA

+0

多くの方法があります。あなたは独自のシリアライズを行うことができます(インスタンスでクラス状態をシリアライズするのは正しいことではありませんが)。あるいは、静的データをインスタンスデータに変換することもできますし、受信側で静的データを再作成することもできます。それは、...もしe。 g。静的フィールドにはいくつのインスタンスが周回しているかのカウンタが保持されていますが、受信側の逆シリアル化でカウンタを1つ増やすのが最善の方法です。しかし、実際の具体的なユースケースには、何をすべきか、どの程度大きく依存しているのでしょうか。 – Vampire

0

シリアル化プロセス中に静的データが無視されるため、静的データを送信することはできません。

実際には、実際のオブジェクトを表すfield(String、Longなど、LocalDateTimeのようなcomplexe型はありません)としてライト型のみを持つ単純なBeanであるDTO(データ転送オブジェクト)を使用できます。

ファーストステップサーバー側:あなたはDataStructオブジェクトを送信する場合DataStructDTOオブジェクトとしてそれを変換し、あなたのオブジェクト からDTOを作成します。

public class DataStructDTO{ 
    private int khar; 
    public DataStructDTO (DataStruct dataStruct) { 
    //since your only data is static, dataStruct parameter is not needed... But if you add any other instance properties, you will need it. 
    this.khar = DataStruct.*getKhar*(); 
    } 

    // implements getter and setter 

そして、ネットワークで送信。

そして、あなたのデータを取得するためにそれを解析:ところで

DataStruct.setKhar(dataStructDTO.getKhar) 

、Javaの規則では、クラス名は(あなたは、例えば代わり​​にdataStructのDataStructを持っている必要があり、大文字で始まる LowerFirstCase変数のためのものです。名前)

関連する問題