Проблема с клиентским потоком на Java-сервере - PullRequest
3 голосов
/ 27 мая 2011

Hello У меня есть очень простая программа клиент-сервер, которая использует сокеты, имитирующие простой банкомат. В клиентской части программы у меня есть класс графического интерфейса пользователя и другой поток для связи с сервером, поэтому графический интерфейс и логика разделены, а также графический интерфейс не зависает в ожидании потока, обменивающегося данными с сервером.

Я создаю один поток, так как клиентский сокет создается при соединении и длится весь сеанс. И проблема в том, что у меня есть поток, зацикливающийся в бесконечном цикле и спрашивающий графический интерфейс, нажал ли пользователь какую-либо клавишу, чтобы он мог позаботиться действий.

Какие-либо предложения передового опыта по этому вопросу? Я не хочу использовать RMI, потому что я развиваюсь по образовательным причинам.

Приветствия

Ответы [ 2 ]

5 голосов
/ 27 мая 2011

Вы можете использовать BlockingQueue .GUI и клиентский поток будут иметь доступ к одному и тому же объекту очереди.В ответ на действие пользователя GUI может поместить объекты команды () в очередь.В клиентском потоке все еще будет цикл while, НО будет использовать take () для вытягивания объектов команд из очереди.take () будет блокировать, используя правильные примитивы синхронизации потоков, чтобы у вас не было занятого цикла.Ответ сервера после команды клиента, вероятно, будет включать в себя обновление некоторого локального состояния и / или обновление графического интерфейса, и я не удивлюсь, если SwingWorker будет вовлечен.это, но это первый, который прыгнул мне в голову.

2 голосов
/ 27 мая 2011

Вы должны использовать больше потоков: основной поток для пользовательского интерфейса, один поток, который связывается с сервером (TC), и один поток, который содержит «бизнес-логику» (TBL).Потоки TC и TBL должны использовать BlockingQueue для ожидания команд (см. Шаблон команды ).

При нажатии кнопки в пользовательском интерфейсе команда помещается в очередьTC или TBL.Они ждут этих команд, выполняют их и либо создают дополнительные команды, либо обновляют пользовательский интерфейс (используя SwingUtilities.invokeAndWait() или SwingUtilities.invokeLater() в зависимости от ситуации).

Это позволяет распутывать все потоки.Вы даже можете протестировать каждый из них по отдельности, создавая команды в своих тестах и ​​помещая их в правильные очереди.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...