Принципы клиент – сервер взаимодействия.
2010-02-21
Речь идет од двух программах, или двух фрагментах одной программы, которые могут предавать друг другу данные. В данном контексте, механизм передачи данных не имеет значения.
Все действия происходят по инициативе клиента. Это значит, что клиент отправляет запросы, а сервер их выполняет. Клиентом считается тот, кто отправляет запросы. Сервером считается тот, кто эти запросы выполняет. Технически возможно, чтоб оба отправляли и выполняли запросы, но это уже не будет называться взаимодействием клиент – сервер. Это аналогично тому, как человек приходит в магазин, чтоб купить какие-нибудь товары. Это всегда происходит по инициативе человека, а не магазина. Человек в роли клиента, магазин в роли сервера. Опять таки, технически, «магазин» может принести товары человеку домой, и попытаться их ему впарить, но это уже не будет магазин. Так же человеку иногда нужны вовсе не товары. Например он может прийти в парикмахерскую чтоб его постригли. В этом случае ему нужно не товар, а услуга. Или нужно выбросить какие-то вещи, например сдать мусор в переработку. В таком случае он не получает, а отдает.
Характер запросов клиента бывает следующий:
1. Сервер должен выполнил какие-нибудь действия для клиента.
2. Сервер должен отдать какие-нибудь данные клиенту.
3. Сервер должен принять какие-нибудь данные у клиента.
Здесь напрашивается ещё один пункт, «клиент должен выполнить какие-нибудь действия для сервера». Но это принципиально неверно. Потому что я ещё раз повторяю, все действия на сервере происходят по инициативе клиента.
Говоря «какие-нибудь» данные или действия, подразумевается некоторые вполне конкретные действия или данные соответствующие некоторому вполне конкретному запросу. То есть не каких-нибудь случайных данных, а вполне определённых.
В случае если целью запроса было получение данных – сервер обязан сообщить клиенту эти данные, или ошибку, если он не в состоянии сообщить данные. Если целью запроса было выполнение некоторых действий сервером, то он обязан выполнить эти действия или сообщить ошибку. При этом он может не возвращать никаких данных. Если целью запроса была передача данных на сервер, сервер должен принять эти данные или вернуть ошибку, но не обязан что-либо выполнять или что-либо возвращать.
Зачастую, один запрос подразумевает более одной цели, или все три. То есть, запрос может подразумевать передачу данных на сервер, обработке этих данных, и возвращение результата клиенту.
********
2010-04-09
Инверсия структуры взаимодействия клиент-сервер
Сервер не должен выполнять целевые указания полученные от клиента. То есть он не должен интерпретировать информацию полученную от клиента как свои внутренние данные. Вместо этого, нужно делать маппинг команд клиента в команды сервера. И дело даже не в проверке или доверии клиентским данным, а дело в искажении понятия взаимодействие клиент-сервер.
По нормальному в этом случае нужно делать «промежуточный клиент» другими словами добавлять ещё один структурный уровень. Таким образом, чтоб целевые указания передавались не на сервер, а на этот промежуточный клиент, который трансформирует их в серверные запросы, каждый из которых вполне соответствует приемлемому интерфейсу сервера. Таким образом, в связке сервер и «промежуточный клиент» нету искажения структуры. А на уровне конечного клиента, структура будет изменена, но она будет оставаться в рамках структуры задаваемой сервером.
Вообще-то это не нормально, когда сервер получает от клиента какие-то указания в терминах сервера, и тупо выполняет эти указания, как будто свои собственные. По сути, это искажение структуры, поскольку на более высоком уровне, клиент выполняет роль сервера. Интерфейс сервера, не должен позволять такого рода искажение. Это функциональная уязвимость, позволяющая изменять, возможно даже изменять произвольным образом, структуру на более высоком структурном уровне.