UI Freeze в простом приложении Socket (Java) с использованием SWT для UI - PullRequest
0 голосов
/ 24 января 2012

Я новичок в Java Socket Programming и в настоящее время изучаю его Socket API. Я создал новое простое приложение, которое запускает ServerSocket и слушает клиентов, когда клиент записывает что-то в сокет, сервер выделяет новый поток для этого клиента. Сначала я попробовал использовать консольное приложение, и все работало нормально Теперь я сделал графический интерфейс для того же, используя SWT (плагин WindowBuilder в Eclipse 3.7). В окне есть кнопка, которая включает и выключает прослушивание сервера. Ниже приведен код, написанный в событии нажатия кнопки SWT, которое начнет прослушивание для клиентов.

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 и, следовательно, будет запускать новый поток для каждого нового клиента. Я знаю, что приведенный выше код работает для консольного приложения, но не будет работать для графического интерфейса, поскольку я запускаю приложение в бесконечный цикл прослушивания клиентских сокетов при нажатии кнопки. Каков элегантный способ запуска и остановки ServerSocket для прослушивания клиентов, которые не замораживают пользовательский интерфейс приложения?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 24 января 2012

Вы должны использовать отдельный поток для принятия клиентских подключений.Кнопка может просто запустить и прервать этот поток.

1 голос
/ 24 января 2012

Вам необходимо запустить свой Сервер в отдельном потоке (из потока рассылки UI).

...