2012-04-20 4 views
2

Я пишу код, который будет имитировать протокол Kerberos на Java. У меня есть класс сервера и класс клиента. Но некоторый контент является статичным, а другой контент - нет, плюс сокеты, я смешался, мягко говоря. Детали протокола, которые, я считаю, произвольны в этом вопросе.Доступ к родительскому экземпляру из дочернего потока

У меня есть класс сервера, который вызывает класс ServerThread:

public class Server{ 

    public void someMethod(){ /* some code */ } 

    public static void main(String args[]){ 
     ServerSocket serverSocket = new ServerSocket(port); 
     new ServerThread(serverSocket.accept()).start(); 
    } 
} 

public class ServerThread extends Thread{ 
    /* constructor (takes serverSocket from Server) */ 

    this.parent.someMethod(); 
    /* That would call someMethod() from the parent class Server instance 
    * that instantiated this. 
    */ 
    } 

Часть класса серверов, которые инстанцируют ServerThread было дано мне, я должен использовать его как есть. Метод someMethod(), который я написал сам, это тот, который я хочу использовать с ServerThread. Есть ли способ сделать это, вызывая строку кода, которая говорит this.parent.someMethod() ;? Если можно, есть ли способ получить доступ к обоим классам из одного класса контроллера или статический контент или нестатический контент разрушают эту идею?

+0

Когда выделен экземпляр «Server»? –

+0

извините, сервер создается в основном методе сервера прямо перед сервером. Это можно перемещать. Любой из этого кода можно перемещать. При необходимости основной метод может быть в отдельном классе. – rshaq

ответ

2

При Выделяют Server (предположительно, только один из них), записать его в статическом поле в Server. Затем вы можете получить доступ к этому полю из любого места, включая ServerThread.

В Server:

static Server server; // the one true server in this application 

В Server.main:

server = new Server(); 

В ServerThread:

Server.server.someMethod(); 
+0

Отлично, спасибо тонну! Спасибо всем, кто пытался. – rshaq

0
class Server extends Thread{ 

    public void someMethod(){ /* some code */ } 

    public static void main(String args[]){ 
     // ServerSocket serverSocket = new ServerSocket(port); 

    } 
} 

    class ServerThread extends Server{ 
    /* constructor (takes serverSocket from Server) */ 
public ServerThread(){ 
    super.someMethod(); 

} 
3

Вы можете передать ссылку на экземпляр Server к ServerThread (через геттер/сеттеры или модификаторы конструктора)? Если да, передайте ссылку, а затем вы можете позвонить server.someMethod(), предполагая, что server - это имя переменной.

Если нет, то ваш someMethod() имеет смысл как статический метод? Если безопасно сделать это статическим методом, вы можете сделать Server.someMethod().

0

При создании экземпляра класса контекста сокета для передачи в ваш поток - тот, который содержит serverSocket и т. Д. - загрузите его с помощью экземпляра сервера 'this ' также. Затем вы можете легко вызвать методы на нем из вашего ServerThread.

Смежные вопросы