2010-05-05 4 views
2

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

  1. Установите соединение и сохраните его до тех пор, пока операция не будет завершена, и клиент получит ответ.
  2. Установите соединение, отправьте данные, закройте соединение. Теперь обработка происходит, и как только она будет завершена, сервер может установить соединение с клиентом для отправки данных.
  3. Установите соединение, отправьте данные, закройте соединение. Обработка происходит. клиент запрашивает сервер, каждые n минут/секунд, если операция завершена. Если обработка завершена, клиент извлекает данные.

Мне было интересно, какой подход будет лучшим способом использования. Может быть, какой-то «де-факто» стандарт для решения этой проблемы? Как «дорого» открывает сокет в Java? Решение 1. Кажется довольно неприятным для меня, но 2. и 3. могли бы сделать. Проблема с решением 2. заключается в том, что сервер должен знать, на каком порту клиент прослушивает, в то время как решение 3. добавляет некоторые сетевые издержки.

ответ

0

Я вижу немедленную проблему с вариантом 2. Если клиент находится за брандмауэром, ему вполне может быть позволено подключиться и выполнить запрос, но серверу может быть отказано в подключении обратно к cilent.

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

+0

вещь с уведомляющим клиентом о том, сколько времени осталось для обработки, является хорошим советом - хотя я могу сделать только очень приблизительную оценку ... – markovuksanovic

2
  1. хорошо прийти
  2. не будет работать во многих ситуациях, например, соНе клиент под брандмауэром, NAT, и так далее. Сервер обычно принимает входящие соединения везде, рабочие столы обычно не
  3. лучше, чем 1, потому что у вас не будет проблем при соединении потеряно
  4. решения 1 + 3 - сделать длинные ожидания соединениями, с периодическим сном и повторно подключиться после. Я имею в виду: подключитесь к серверу, подождите 30 секунд для данных, если нет данных, спать в течение 10 секунд, цикл.

Открытие сокетов иногда дорого, но не так дорого, что обработка данных.

+0

Ну 4. решение не подходит для меня ... Мне нужно иметь порт как можно дольше - я хочу потреблять как можно меньше ресурсов и уменьшать количество конфигурации, которая должна быть выполнена. Мне нужно иметь n клиентов, чтобы иметь возможность подключаться к серверу и передавать данные для обработки. По мере обработки другие клиенты должны иметь возможность вводить свои данные для обработки, используя тот же порт. На данный момент я не думаю, что было бы хорошо, если бы мне пришлось настраивать порт для каждого клиента, который хочет подключиться. – markovuksanovic

+0

Какая причина для конфигурирования другого порта для каждого пользователя ???? достаточно открыть только один порт для прослушивания, для всех подключений от всех клиентов. И спальные соединения не требуют больших ресурсов (если вы используете NIO, из курса). Вы можете обрабатывать одновременно десятки и сотни одновременных подключений (если у вас есть enouhg RAM) –

Смежные вопросы