Я пишу простое многопоточное клиент-серверное приложение с использованием сокетов, и у меня есть несколько вопросов:
- Для клиента, действительно ли необходимо использовать отдельный поток для получения данных с сервера?
Многие ресурсы, которые я обнаружил, используют объект client для отправки данных (используя dataOutputStream) на сервер, в то же время используя один поток специально для получения данных (используя dataInputStream) с сервера.Предположительно, это связано с тем, что потоки ввода / вывода по своей природе блокируются, поэтому один поток выполнения не должен иметь возможность отправлять данные (или делать что-либо еще) во время ожидания сообщения сервера, поскольку программа блокируется до тех пор, пока что-то не получено.
Однако клиент, который я написал, мог отправлять и получать, не используя отдельный поток.Код для получения данных (т. Е. Socket.readUTF ()) был помещен в цикл while, а код для отправки данных (т. Е. Socket.writeUTF ()) был в методе actionPerformed () (который вызывается при нажатии пользователем кнопки).).Насколько я могу судить, пока пользователь ничего не делал, выполнение программы оставалось в цикле while, ожидая сообщения сервера.Когда пользователь нажимает кнопку, запускается метод actionPerformed (), который «прерывает» цикл while и отправляет сообщение.После этого программа вернулась к прослушиванию.Отправка и получение работали отлично.
Почему тогда люди используют отдельный поток?
- Если я решу использовать отдельный поток для получения, нужно ли сделать объект клиентакак нить?Или я могу просто запустить клиент как объект?Я спрашиваю об этом, потому что я заметил, что некоторые люди запускали клиентский объект как поток.
Я не слишком уверен, почему они это сделали, потому что, насколько я могу судить, когда вы создаете объекти поток, они работают одновременно (то есть, как два потока).Поскольку в этом случае задействован только один объект (клиент), его не нужно запускать как поток, верно?Или я что-то упустил?
- Нужно ли объекту получать блокировку для доступа к своему собственному методу, если этот метод синхронизирован?Вот моя ситуация:
Мой сервер реализован как объект.Потоки сессий создаются для каждого клиентского соединения.Каждый поток сеанса вызывает метод handle () объекта сервера всякий раз, когда получает запрос клиента.Метод handle синхронизируется и отправляет информацию о возврате клиенту.
Помимо метода handle (), на сервере также есть некоторые другие методы, которые отправляют информацию каждому клиенту.Эти методы могут быть вызваны в любое время через графический интерфейс сервера (они не вызываются потоками сеанса).Пока работает метод handle (), я НЕ хочу, чтобы эти другие методы выполнялись, поскольку они могут мешать handle () и портить протокол отправки.Другими словами, я хочу, чтобы метод handle завершил работу до того, как эти другие методы будут запущены.
Могу ли я сделать эти методы синхронизированными, чтобы объект сервера не вызывал их при выполнении метода handle, и наоборот?Теоретически серверный объект должен был бы ждать освобождения блокировки дескриптора, прежде чем он сможет вызвать их.Я просто не уверен, нужно ли объекту (не потоку) получить блокировку для своего собственного синхронизированного метода, чтобы получить к нему доступ.Отсюда и мой вопрос.
Извините за недостаток краткости, но я хотел быть максимально ясным.Объяснения и отзывы очень приветствуются.
Заранее спасибо.