Как получить объекты из запущенного потока сервера?

У меня есть эта структура в моей программе:

class Node0
  private Server server;
  ...
  public void init(){
      server.waitConnections();
  ...

class Server
  socket = ss.accept(); // ss :socketServer object
  handler = new Handler(socket);
  handler.start(); // start handler thread


class Handler
  public void run() {
    while (true) {
      try {
        package = (Package) ois.readObject(); // ois :ObjectInputStream
        if (package != null) {
          this.setPackage(package);
        }
      } catch (Exception e) {
        break;
      }
  }

Но теперь мне нужно получить объект пакета в классе Handler в моем классе Node0, как я могу это сделать? Я получаю посылку в Handler класс, но теперь я должен иметь возможность отправить этот объект в мой класс Node0, но если я попытаюсь получить это значение через:

class Node0
    server.getHandler().getPackage();

Запускает NullPointerException,

Есть идеи, как я могу это сделать?

2 ответа

Решение

Почему бы вам не попробовать использовать функцию обратного вызова? Вы не можете знать, когда Обработчик установил пакет. Вы должны запустить действие из обработчика.

На основе вашего очень минималистичного примера, не проверенного или даже не скомпилированного:

class Node0
  private Server server;
  ...
  public void init(){
      server.setNode(this);
      server.waitConnections();
  ...
  public doPackage(Package p){
      // do something with p;
  ...

class Server
  public setNode(Node n) {
      this.node = n;
  }
  socket = ss.accept(); // ss :socketServer object
  handler = new Handler(socket, node);
  handler.start(); // start handler thread

class Handler
  ...
  public Handler(Socket socket, Node node){
    this.socket = socket;
    this.node = node;      
  }
  public void run() {
    while (true) {
      try {
        package = (Package) ois.readObject(); // ois :ObjectInputStream
        if (package != null) {
          // this.setPackage(package);
          this.node.doPackage(package);
        }
      } catch (Exception e) {
        break;
      }
  }

Мне нужно получить объект пакета в классе Handler в моем классе Node0

Зачем? Код, который обрабатывает входящие данные, должен находиться в классе Handler. Ваш класс Node0 есть или должен быть там только для выполнения цикла accept(). Для этого нет никаких причин делать что-либо еще.

Другие вопросы по тегам