Да, это вполне возможно, и на самом деле очень распространено. Большинство корпоративных приложений используют это преимущество.
Например, пользователь запрашивает веб-страницу для отображения в браузере с веб-сервера. Точнее, запрос пользователя на показ статьи 23.
Затем веб-сервер запрашивает информацию базы данных, касающуюся статьи 23. Получив ответ от сервера базы данных, веб-сервер создает хорошо отформатированную HTML-страницу для отображения пользователю.
Концептуально использование сети - это просто способ общения, то есть отправка или получение информации. Это не сильно отличается от записи / чтения из файла. И в Linux это тоже самое.
Так что да, каждый сервер может прослушивать порт и в то же время быть клиентом другого сервера. Классическая реализация для сервера в слове JAVA заключается в использовании одного потока на клиента на стороне сервера.
Это означает, что когда P2 подключается к P1, между P1 и P2 устанавливается новое соединение, и P2 использует поток для записи ответа на P1 ... В большинстве простых случаев тот же поток фактически запрашивает недостающую информацию с другого сервера, поэтому отправка запроса и ожидание ответа.
Ответ на ваше изменение:
Классическая многопоточная реализация сервера заключается в прослушивании порта с бесконечным циклом. Каждый раз, когда вы обнаруживаете запрос соединения от клиента, вы устанавливаете соединение, согласовываете порт, который будет использоваться на клиенте и сервере для этой связи, и вы делегируете это соединение другому потоку (обычно с использованием пула потоков, чтобы не использовать поток для следующий клиент, когда связь закончена).
Таким образом, у вас всегда есть доступная тема для ответа на запрос подключения от клиентов.