2016-07-08 3 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

같은 것은 객체에 포함 된 정적 데이터가 없습니다. 객체, 즉. 이자형. 클래스의 인스턴스에는 인스턴스 데이터 만 있습니다. 정적 데이터는 특정 인스턴스가 아닌 클래스에 속합니다. 직렬화 전략없이 Java 직렬화 메커니즘을 사용하지만 기본값을 사용하는 것만으로 정적 데이터가 전송되지 않습니다. 인스턴스를 직렬화하고 정적 데이터가 인스턴스와 직접적으로 관련이 없으므로 간접적으로 존재하므로 객체가 인스턴스 인 클래스와 관련있다.

+0

감사합니다. 그래서 데이터를 전송하기 위해 필자는 직접 직렬화 메커니즘을 추가해야합니까? – AHPA

+0

다양한 방법이 있습니다. 자신 만의 직렬화를 만들 수 있습니다 (인스턴스를 사용하여 클래스 상태를 직렬화하는 것이 올바른 일은 아니지만). 또는 정적 데이터를 인스턴스 데이터로 변환하거나 수신 측에서 정적 데이터를 다시 만들 수 있습니다. 그것은, ... e. 지. 정적 필드에는 얼마나 많은 인스턴스가 있는지에 대한 카운터가 있습니다. 가장 좋은 방법은 수신 측의 직렬화 해제시 카운터를 하나씩 늘리는 것입니다. 그러나 실제로해야 할 일과 실제적인 구체적인 유스 케이스에 얼마나 의존 하는가. – Vampire

0

직렬화 프로세스 중에 정적 데이터가 무시되므로 정적 데이터를 보낼 수 없습니다.

대신 실제 객체를 나타내는 필드 (문자열, Long 등의 LocalDateTime과 같은 complexe 유형 없음)로만 Light Types가있는 기본적으로 빈인 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 개체를 보낼 경우 DataStructDTO 개체로 변환, 개체 에서 DTO를 만들 수 있습니다.

그리고, 데이터를 얻기 위해 구문 분석 : 그런데

DataStruct.setKhar(dataStructDTO.getKhar) 

, 자바 규칙과, 클래스 이름 (이 예를 들어 대신 dataStruct의 DataStruct가 있어야 대문자로 시작 LowerFirstCase 변수입니다. 이름)

관련 문제