Сервер запрашивает информацию у Клиента?

В системе клиент-сервер считается ли хорошей архитектурой для серверного метода «запрашивать у клиента» дополнительную информацию? Если так, каков наилучший способ разработать такой сценарий? Есть ли «шаблон» для этого?

Например, предположим, что конечный пользователь выбирает набор записей, которые он хочет удалить, в пользовательском интерфейсе клиента, а затем клиент выполняет «удаление записей», обращаясь к серверу с набором записей в качестве параметра. Затем сервер находит подмножество тех записей, которые в некотором роде являются «особыми» и поэтому должны быть подтверждены пользователем. Является ли целесообразным, чтобы сервер каким-то образом «перезвонил» клиенту методу, называемому «подтвердить записи», продолжая при этом исходный вызов от клиента к серверу?

А как насчет более сложных обращений к серверу, которые могут потребовать длительного «диалога» между сервером и клиентом?

11.12.2008 23:17:32
4 ОТВЕТА
РЕШЕНИЕ

Подобный обратный вызов меняет роль клиента и сервера. Во многих архитектурах такого типа клиент не может прослушивать запросы. Если это так, вы начинаете смотреть на P2P-систему. Возможно, что-то подобное может сработать.

client code: 
  special_records = server.deleteRecords(records)
  server.deleteSpecialRecords(special_records)

server code:
  def deleteRecords(records):
    special_records = detectSpecialRecords(records)
    reply(special_records)
    actuallyDeleteRecords(records - special_records)

Таким образом, первый вызов deleteRecords вернул бы список этих специальных записей, которые необходимо явно удалить. Надеюсь это поможет.

0
12.12.2008 01:41:41

Какой-то ответ, который говорит: «Записи x, y и z не были удалены, попробуйте еще раз с I_RELLY_WANT_TOнабором для их удаления», мне показалось бы разумным решением.

Общая картина; не спрашивайте, делайте вещи и сообщайте, пусть клиент решает, что делать дальше. Это можно сделать в контексте постоянного соединения как формы диалога.

Не совсем мое поле, так что ... добавить 64 мг NaCl

1
11.12.2008 23:26:35

Я думаю, что такая договоренность полностью в порядке. Ничто не мешает серверу ответить клиентом на запрос дополнительной информации и предоставить ее клиенту. Пока сокетное соединение открыто, вы можете свободно отправлять сообщения туда и обратно.

Я видел соглашение, когда клиент отправлял сообщение на сервер и после этого не делал ничего, кроме небольшого слоя над stdin / out и файловой системой на локальной машине, поскольку сервер контролировал это. Это работало нормально и было очень быстро.

0
12.12.2008 04:40:56

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

Если распространенным случаем является то, что все файлы были успешно удалены, возможно, начните ответ с поля состояния, которое указывает, были ли удалены все файлы или нужно ли клиенту на самом деле оценивать коды состояния, чтобы увидеть, как прошла операция.

С помощью этого ответа клиент должен иметь возможность обновить свое представление о состоянии сервера, по крайней мере, в отношении файлов, которые были выбраны для удаления (т. Е. Удалить из пользовательского интерфейса те файлы, которые были успешно удалены, но также и те, которые были удалены которые больше не существуют, а также, возможно, указывают те файлы, которые сервер не может удалить из-за отсутствия соответствующего разрешения).

1
17.12.2008 19:51:17