Как реализовать Peer-код, т. Е. Серверный и клиентский код в одном файле, с помощью программирования Java Socket - PullRequest
1 голос
/ 28 апреля 2011

Можно ли написать программу, которая будет служить как сервером, так и клиентом? Предположим, у меня есть три экземпляра программы P: P1, P2 и P3.

  1. В одном случае P2 запрашивает файл у P1.
  2. Пока P1 передает файл на P2, P1 запрашивает форму файла P3.
  3. P3 передает файл в P1. (На данный момент P3 может загружать / скачивать с P1 или P2.)

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

EDIT:


У меня есть некоторый исходный код, который позволяет мне как клиенту запрашивать файл с сервера (при условии номера порта сервера и имени файла). Тот же код также запускает серверный поток, который прослушивает входящие запросы. Таким образом, по сути, эта кодовая база служит в качестве Peer (как клиента, так и сервера).

Но теперь моя проблема заключается в том, что после того, как я сделал первый запрос к файлу, код навсегда зацикливается на серверной части, что фактически не позволяет мне делать какие-либо дополнительные запросы в качестве клиента. У меня такой вопрос: могу ли я оставить сокет открытым, пока сервер прослушивает порт без необходимости для бесконечного цикла сервера? Таким образом, я могу запускать Сервер в фоновом режиме и при необходимости отправлять команды Клиенту.

1 Ответ

2 голосов
/ 28 апреля 2011

Да, это вполне возможно, и на самом деле очень распространено. Большинство корпоративных приложений используют это преимущество.

Например, пользователь запрашивает веб-страницу для отображения в браузере с веб-сервера. Точнее, запрос пользователя на показ статьи 23.

Затем веб-сервер запрашивает информацию базы данных, касающуюся статьи 23. Получив ответ от сервера базы данных, веб-сервер создает хорошо отформатированную HTML-страницу для отображения пользователю.

Концептуально использование сети - это просто способ общения, то есть отправка или получение информации. Это не сильно отличается от записи / чтения из файла. И в Linux это тоже самое.

Так что да, каждый сервер может прослушивать порт и в то же время быть клиентом другого сервера. Классическая реализация для сервера в слове JAVA заключается в использовании одного потока на клиента на стороне сервера.

Это означает, что когда P2 подключается к P1, между P1 и P2 устанавливается новое соединение, и P2 использует поток для записи ответа на P1 ... В большинстве простых случаев тот же поток фактически запрашивает недостающую информацию с другого сервера, поэтому отправка запроса и ожидание ответа.

Ответ на ваше изменение:

Классическая многопоточная реализация сервера заключается в прослушивании порта с бесконечным циклом. Каждый раз, когда вы обнаруживаете запрос соединения от клиента, вы устанавливаете соединение, согласовываете порт, который будет использоваться на клиенте и сервере для этой связи, и вы делегируете это соединение другому потоку (обычно с использованием пула потоков, чтобы не использовать поток для следующий клиент, когда связь закончена).

Таким образом, у вас всегда есть доступная тема для ответа на запрос подключения от клиентов.

...