【问题标题】:How to get the current running class as an object?如何获取当前正在运行的类作为对象?
【发布时间】:2016-09-18 23:28:58
【问题描述】:

我有一个名为Server 的JFrame,它托管一个带有TextArea 的套接字服务器作为控制台。每个连接的客户端都会创建一个名为clientThread 的新线程。

我的问题是:clientThread 如何将字符串附加到服务器中的 TextArea。我想将运行类作为参数传递,但我不知道该怎么做。有什么想法吗?

客户端线程:

public class ClientThread extends Thread{
    Socket clientSocket;
    int ClientID = -1;
    boolean running = true;
    BufferedReader  in;
    PrintWriter out;
    Server console;

    public ClientThread(Socket s,int id,Server obj) throws IOException{
        clientSocket=s;
        ClientID=id;
        console=obj;
        in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        out = new PrintWriter (new OutputStreamWriter(clientSocket.getOutputStream()));
    }

服务器:

public class Server extends javax.swing.JFrame {

    /**
     * Creates new form Server
     */
    public Server() {
        initComponents();
    }

    static public void writeToConsole(String s) {
        jTextArea1.append(s);
    }

    public static void main(String args[]) {

        try {
            ServerSocket servSocket = new ServerSocket(8008);
            writeToConsole("Server Started\n");
            int clientID = 1;
            while (true) {
                Socket clientSocket = servSocket.accept();
                //Pass this class to the ClientThread As object??
                ClientThread clientThread = new ClientThread(clientSocket, clientID++, (theObjectOfThisClass))
                );
                    clientThread.start();
            }

            /* Create and display the form */
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    new Server().setVisible(true);
                }
            });
        } catch (IOException ex) {
            Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
}

编辑:固定 ClientThread 构造函数

【问题讨论】:

  • 您在寻找this吗?
  • @chrylis 是的,这个关键字有效,但是该类是非静态的,并且该语句在 main 方法中。有什么想法吗?
  • 我对您创建线程的方式感到困惑。这发生在无限循环中,因此即使您知道如何将JFrame 的实例发送到每个线程,您仍然永远不会显示窗口。
  • 所以为了澄清一下,这些ClientThreads 的目的是什么?它们将如何用于您正在构建的系统的其余部分?
  • 更重要的是,为什么需要无限多线程?

标签: java swing netbeans


【解决方案1】:

您可以将Server 作为参数添加到ClientThread 构造函数:

public ClientThread(Socket s,int id,ServerConsole obj, Server server)

不过,在从另一个线程修改 GUI 时要小心。您将需要创建一个Runnable 以使用SwingUtilities 在主 UI 线程上运行。您可以使用runAndWait() 或runLater()。

如您所知,main() 是静态的,因此没有 this 引用。相反,您已经在稍后的main() 中使用new Server() 创建了Server 实例。您需要尽快创建此对象并存储对它的引用,以便您可以在任何需要的地方使用它。

编辑:

我的想法是这样的:

public static void main(String args[]) {
    Server server = new Server();
    ClientThread clientThread = new ClientThread(clientSocket, clientID++, server);
    SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        server.setVisible(true);
    }
});
    }

请注意,由于您只需要一个窗口,因此您应该只执行一次new Server()。您必须在使用它之前初始化变量,否则引用将是null,这将导致更多问题。

【讨论】:

  • 是的。那部分我知道。我想知道在这里做什么? ClientThread clientThread = new ClientThread(clientSocket, clientID++,(theObjectOfThisClass)));
  • @RenierSwart 您需要对 Server 对象的引用。最简单的方法是在循环之前创建它,然后稍后重用相同的实例来调用setVisible(true)。但是,我认为您会遇到其他问题,因为while 循环是无限的。
  • 这可能行得通,我试试看,然后告诉你。
【解决方案2】:

好的,我设法解决了这个问题。对于任何有同样问题的人,这里是如何解决它:

为当前类创建一个局部变量:

static  Server svr;

在类构造函数中(将 Server obj 传递给自身)

public Server(Server server) {
        initComponents();
        svr=server;
    }

当 GUI 调用被调用时,发送你创建的变量的本地 obj:

java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    new Server(svr).setVisible(true);
                }
            });

感谢 Code Apprentice 的创意。

【讨论】:

  • 将 Server 传递给 Server 构造函数的目的是什么?你有多个窗口吗?还有为什么变量是静态的?
  • 将Server传递给Server构造函数的目的是让当前运行的类被发送到ClientThread,这不会创建Server的多个窗口,它是静态的,因为Server是在public static void中创建的主要的。它允许从客户端发送的数据被 ClientThread 接收并显示在服务器的文本区域。
  • Server 类已经有 this 引用,所以你不需要向构造函数发送另一个引用。
  • 静态也与 o 对象的创建位置无关。它与访问方式有关。
  • 您是否仍在 main() 中创建您的 ClientThreads 或者您是否更改了它。如果您没有更改它,则将 Server 传递给 Server 构造函数是无济于事的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-12
  • 1970-01-01
相关资源
最近更新 更多