使用SWT for UI在简单的Socket(Java)应用程序中进行UI冻结

时间:2012-01-24 12:12:54

标签: java multithreading sockets swt freeze

我是Java Socket Programming的新手,目前正在探索它的Socket API。我创建了一个新的简单应用程序,启动ServerSocket并侦听客户端,当客户端在套接字上写入内容时,服务器为该客户端分配新线程。我首先尝试使用控制台应用程序,一切正常。现在,我使用SWT(Eclipse 3.7中的WindowBuilder插件)制作了相同的GUI。窗口有一个按钮,可以打开和关闭服务器的监听。下面是SWT Button点击事件中编写的代码,它将开始监听客户端。

if(!isServerRunning)
{
    btnServerRunner.setText("Stop Server");
    isServerRunning = true;
    while (listening)
    {
        try
        {
            new ClientHandler(listener.accept()).start();
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
    }
}
else
{
     try
     {
         listener.close();
     }
     catch(Exception ex)
     {
         ex.printStackTrace();
     }
     btnServerRunner.setText("Start Server");
     isServerRunning = false;
}

ClientHandler类已扩展Thread,因此将为每个新客户端启动新线程。我知道上面的代码适用于控制台应用程序,但不适用于GUI,因为我将应用程序扔进了按钮单击时监听客户端套接字的无限循环。启动和停止ServerSocket监听不冻结应用UI的客户端的优雅方法是什么?

感谢。

2 个答案:

答案 0 :(得分:2)

您应该使用单独的线程来接受客户端连接。该按钮可以启动并中断该线程。

答案 1 :(得分:1)

您需要在一个单独的线程中运行您的服务器(来自UI分派线程)。