Как получить объекты из запущенного потока сервера? - PullRequest
0 голосов
/ 10 октября 2011

В моей программе есть такая структура:

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 ]

2 голосов
/ 10 октября 2011

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

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

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;
      }
  }
1 голос
/ 10 октября 2011

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

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

...