Поддерживать соединение после получения ответа от HTTP-сервера - PullRequest
1 голос
/ 18 сентября 2009

У меня есть клиент-серверная система, в которой клиент должен разветвить дочерний элемент и вернуть его pid обратно на сервер. После этого ему необходимо поддерживать соединение с сервером, благодаря чему он продолжает отправлять журналу сервера информацию о дочернем объекте и другие запросы, которые он может захотеть отправить как часть информации об отладке.

Мой вопрос: как это можно сделать? Должен ли я каждый раз подключаться к серверу, отправлять ему pid и просить его зарегистрировать запрос [поскольку у меня может быть несколько клиентов, отправляющих запросы на сервер одновременно], или есть другой способ сделать это?

Ответы [ 2 ]

2 голосов
/ 18 сентября 2009

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

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

Одна общая установка для такой системы:

  • Серверный процесс запускается как демон, который прослушивает известный или настроенный порт.
  • Первоначальный клиентский (родительский) процесс устанавливает соединение с сервером.
  • Вторичный клиентский (дочерний) процесс отключает унаследованное соединение и устанавливает свое собственное соединение с сервером.

Существует два режима работы для соединений:

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

Оба режима работают - они по-разному влияют на издержки (при каждом подключении требуется много времени) и использование ресурсов (постоянные соединения потребляют больше ресурсов на сервере; клиенты не подвергаются серьезному воздействию).

1 голос
/ 18 сентября 2009

Если между клиентом и сервером нет межсетевых экранов с сохранением состояния / NAT с таймаутом, TCP-соединение будет длиться бесконечно, без необходимости отправки каких-либо данных. Вы можете установить некоторые параметры сокетов, которые будут периодически отправлять пакеты, не содержащие никаких данных (и разрывать соединение, если ответ не получен) - поиск SO_KEEPALIVE .

Если вы говорите о каком-то конкретном HTTP-сервере, у него, вероятно, есть опция для определения продолжительности соединения без каких-либо запросов, например KeepAliveTimeout в apache.

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