1

我的服务器是围绕支持更新侦听套接字而构建的,这样做我使用以下方法。我的问题发生在第二次调用此方法后,首先在 main 方法启动时调用它,然后通过单击 JFrame 中的按钮调用它。发生的情况是,当通过按钮调用此方法时 JFrame 冻结,正如您从代码中看到的那样,我试图使此方法在新线程中运行服务器,但它并没有改变我的结果。有谁知道如何解决这一问题?或者至少是什么原因造成的?在 main 中调用该方法之后的任何代码也不会执行,所以我相信这是一个线程问题。(MiniServer 扩展了 Thread 并用于单独处理每个连接的客户端)

public static void startListening(final int port)
{
    listeningThread = new Thread() 
    { 
        public void run()
        {               
            try {
                serverSocket = new ServerSocket(port);

                while(!stop)
                {
                    boolean loop = true;
                    while (loop)
                    {
                        serverSocket.setSoTimeout(1000);

                        try{
                            clientSocket = serverSocket.accept();
                            loop = false;
                        } catch (SocketTimeoutException e){
                        }
                    }
                    if(!clientSocket.equals(null))
                    {
                        MiniServer mini = new MiniServer(clientSocket);
                        mini.start();
                        clientSocket = null;
                    }
                }
            } catch (IOException e) {
            }
        } 
    };
    listeningThread.run();
}
4

1 回答 1

3

您需要调用listeningThread.start(),这将创建一个新线程。现在,您只是在当前run()线程上调用线程的方法。第一次这样做时它会起作用,因为你在主线程上。但是,第二次,您在 UI 线程上,对按钮按下作出反应。这会导致您的 UI 线程阻塞。

于 2013-04-17T20:58:45.560 回答