![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как поставить и прочитать кук при помощи TServerSocket? [D6, WinXP]
Интересующийся © (2006-02-14 07:03:00)Задача такова:
Научить Web-сервер (основа TServerSocket?) работа с куками.
Реализация идет при обработки клиентского запроса с помощью процедуры и функции (ReadCookie(), WriteCookie()).
P.S.
Я отлично знаю то, что компонент транспортный, поэтому в его работу я нелезу.
Digitman (2006-02-16 13:39:00) [1]Ты вообще русский ?)
Интересующийся (2006-02-16 13:31:00) [2]> Это как раз синхронный режим.
Как раз это я и хотел написать, асингронный поставил по превычке. :((
Digitman (2006-02-16 08:14:00) [3]
> Работу в асинхонном режиме при "stThreadBlocking"
Это как раз синхронный режим.
Пример использования TServerSocket в режиме stThreadBlocking есть в проекте scktsrvr.dpr в штатной поставке Делфи.
Интересующийся (2006-02-16 05:04:00) [4]>Digitman © (15.02.06 09:48) [7]
>Т.е. ты замесил в одну кашу транспортную и прикладную логику.
>Digitman © (15.02.06 09:56) [8]
>Ты концептуально неверно используешь возможности асинхронного неблок. режима гнезда.
Возможно это и так. :(((
Работу в асинхонном режиме при "stThreadBlocking" я знаю только теоретически и напрактике не использует.
Может кто подскажет как правильно реализовать в асинхронном режиме всю работу?
P.S.
Пока мой вариант меня устраивает.
Интересующийся (2006-02-16 04:57:00) [5]Digitman © (15.02.06 09:48) [7]
>В цикле ?
А зачем, поток открывается для одного единственного коннекта, обрабатывает его и закрывается.
> А если эти методы вернули -1 ?
В Execute у потока в котором идет вся работа следующее:
if Socket=nil then exit;
if not FSocket.connected then break;
s:=Socket.ReceiveText;
if length(s)<>3 then if copy(s,length(s)-3,4)=#13#10#13#10 then break;
while fsocket.SendBuf(buf[0],frc)=-1 do if not fsocket.Connected then exit else sleep(1);
Это из старой версии вней применялся SendText() для отправки текста и SendBuf() для остальных файлов.
A.S.
Сервер нормально работал при количестве клиентов <=10.
Digitman (2006-02-15 09:56:00) [6]Ты концептуально неверно используешь возможности асинхронного неблок. режима гнезда.
Транспортные события (например, события чтения/записи) на то и существуют, чтобы алгоритм ничего не ждал, а реагировал нужным образом лишь по факту возникновения этих событий.
Digitman (2006-02-15 09:48:00) [7]Т.е. ты замесил в одну кашу транспортную и прикладную логику.
> ловит данные из сокета ReceiveTex
В цикле ?
> отправляет ответ с помощью SendText и SendBuf()
А если эти методы вернули -1 ?
Интересующийся (2006-02-15 09:38:00) [8]OnClientRead/Write у меня неиспользуются.
Я юзаю только OnConnect и OnErrro (неблокированный сокет)
Вся обработка ведется в компоненте являющимся прямым потомком TThread, в который прописан TCustomWinSocke.
Алг. таков:
1. Обрабатываем OnConnect в котором запускаем новый поток и передаем в него сокет.
2. После активизации поток ловит данные из сокета ReceiveTex обрабатывает их и отправляет ответ с помощью SendText и SendBuf().
3. Закрывает сокет.
4. Производит запись в лог.
Digitman (2006-02-15 09:16:00) [9]
> Передаю обработку в отдельный поток (Thread)
Обработку чего?
Обрабатывать-то еще нечего !
Ты же сам говоришь, что "Там отлавливаю текст от клиента при помощи TCustomWinSocket" ? Спрашивается, что обрабатывает thread, если от клиента еще не поступили никакие данные ? И что, спрашивается, делается у тебя в обработчиках OnClientRead/Write, вызываемых (как я понял) в основном потоке ?
Интересующийся (2006-02-15 07:12:00) [10]Про TCustomWinSocket верно. :)))
Проблемы нет.
Есть два варианта:
1. (Которорый использую я)
Передаю обработку в отдельный поток (Thread), работа ведется при неблакированном сокете.
Там отлавливаю текст от клиента при помощи TCustomWinSocket внедренный в поток.
Ищу нужную мне инву и обрабатываю ее.
Для обработки авторизации и работы с куками в поток добавляются процедуры и функции чтения и записи куков и проверки авторизации.
P.S
Реализацию при блокированном сокете я не пробовал, поскольку не использую этот режим.
2. (Нежелательный для большинства)
Переписываются TCustomWinSocket и TServerSocket (Добавляются екобходимые процедуры и функции).
Возможно при таком подходе придется переписывать все остальные компоненты с которыми работает TServerSocket.
От этого способа я токазался в виду того, что он трудоемкий (хотя у него есть ряд приимуществ).
Digitman (2006-02-14 14:16:00) [11]Ну и ?
TCustomWinSocket имеет метод передачи текста (SendText) и метод приема текста (ReceiveText). Обе твои ф-ции работают как раз с текстом.
В чем проблема ?
Интересующийся (2006-02-14 13:30:00) [12]Две полезные фунции
1.
function CodingCookie(UserCookie:WideString):String;
var
Dst:String;
DstW:WideString;
i:Integer;
begin
Dst:='';
for i:=1 to Length(UserCookie) do Dst:=Dst+'%u'+IntToHex(Integer(UserCookie[i]),4);
result:=Dst;
end;
2.
function DecodingCookie(UserCookie:String):String;
var
SL:TStrings;
Dst:String;
i:Integer;
begin
SL:=TStringList.Create;
try
SL.Text:=StringReplace(UserCookie,'%u',#13'$',[rfReplaceAll]);
for i:=1 to SL.Count-1 do Dst:=Dst+WideChar(StrToInt(SL[i]));
finally
SL.Free;
end;
result:=Dst;
end;
P.S.
Функции можно использоватьи для URL и HTML-форм.
Интересующийся (2006-02-14 07:05:00) [13]Пример куков от клиента
1.
Cookie: delphi_name=User; delphi_email=User@Mail.ri
Cookie2: $Version=1
2.
Cookie: hotlog=1; delphi_name=%u041F%u043E%u043B%u044C%u0437%u043E%u0432%u0430%u0442%u0435%u043B%u 044C; delphi_email=User@Mail.ru
Cookie2: $Version=1