Я создаю приложение Java с графическим интерфейсом и сервером на основе сокетов, и я постоянно сталкиваюсь с проблемами, когда одна часть приложения застревает в ожидании другого (в основном графический интерфейс, ожидающий сервера - не удивительно Несколько раз мне удается избежать этих ошибок, вместо этого я оказываюсь в конце своего метода main
почти сразу после запуска. (Приложение может работать или не работать, в зависимости от того, есть ли какой-либо GUI видимый или нет, но Я хотя метод main
не должен был не возвращаться, пока программа на самом деле выхода ...)Сколько потоков мне действительно нужно?
Моих требований по применению является следующим:
- Он должен иметь возможность обрабатывать неопределенное количество клиентов одновременно
- Связь между сервером и клиентами может идти в любом направлении и не обязательно каждый другой ход; иногда сервер отправляет кучу сообщений и получает ответы только от некоторых клиентов, в других случаях это наоборот.
- Никогда не должно быть «слишком поздно» для подключения клиента - серверу необходимо постоянно принимать соединения непрерывно до тех пор, пока работает серверное приложение.
- В течение всего времени GUI не должен подвергаться воздействию сервера и клиентов, ожидающих друг друга. Обновления GUI происходят через прослушиватели событий на других объектах (в основном на модели), которые изменяются фоновыми потоками.
Я пробовал со следующим, но я не могу понять, что это правильно.
- 1 нить для метода
main
и «регулярная» работа, выполняемая создаваемыми им объектами (контроллер, модель и т. Д.). Это проблема, с которой я иногда сталкиваюсь, потому что она не держится в любом месте и возвращается сmain
преждевременно. - Использование
EventQueue.invokeLater(new Runnable() { ... });
Выполняю все фактические манипуляции с графическим интерфейсом в потоке пользовательского интерфейса, но ни один из этих вызовов не является «выживающим» потоком, поэтому они в основном просто работают асинхронно с основного потока. - 1 нить для
ServerSocket
для продолжения прослушивания новых соединений. - 1 поток для каждого клиента, чтобы иметь возможность слушать сообщения от клиентов. Я не уверен здесь, если мне нужен еще один поток здесь, чтобы иметь возможность отправлять сообщения «не по порядку», т. Е. Не дожидаясь получения первого.
Я никогда не писал (настоящее) многопоточное приложение раньше, так что это совершенно новое основание для меня. Тем не менее, я отказываюсь верить, что эта проблема не была успешно решена раньше - даже столько раз, что развивались какие-то передовые методы.
Что это такое? Что такое хорошая архитектура для этого приложения?
Я никогда не слышал о 'java.nio. *' (В конце концов, мое единственное реальное не-ковбойское Java-образование было основным курсом программирования в первый год моего бакалавра ... и класс в стиле, который был в Java из удобства. Конечно, удобство учителя ...), но после небольшого чтения это определенно похоже на путь. Благодаря! –