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

Отправка статических данных невозможна, так как статические данные игнорируются в процессе сериализации.

Вместо этого вы можете использовать DTO (объект передачи данных), который в основном представляет собой простой компонент с только светлыми типами в виде полей (String, Long и т. Д.), Представляющих ваш реальный объект, не является сложным типом, например LocalDateTime).

Первый шаг в сторону сервера: создать DTO от вашего объекта Если вы хотите отправить DataStruct объект, преобразовать его в качестве объекта DataStructDTO:

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) 

Кстати, с ява конвенций, имена классов начинаются с заглавной буквы (вы должны иметь DataStruct вместо dataStruct, например LowerFirstCase являются для переменных. имена)