Как получить объекты из запущенного потока сервера?
У меня есть эта структура в моей программе:
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(). Для этого нет никаких причин делать что-либо еще.