Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.06.25;
Скачать: CL | DM;

Вниз

Как поставить и прочитать кук при помощи TServerSocket?   Найти похожие ветки 

 
Интересующийся   (2006-02-14 07:03) [0]

Задача такова:

Научить Web-сервер (основа TServerSocket?) работа с куками.

Реализация идет при обработки клиентского запроса с помощью процедуры и функции (ReadCookie(), WriteCookie()).

P.S.
Я отлично знаю то, что компонент транспортный, поэтому в его работу я нелезу.


 
Интересующийся   (2006-02-14 07:05) [1]

Пример куков от клиента

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


 
Интересующийся   (2006-02-14 13:30) [2]

Две полезные фунции

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-форм.


 
Digitman ©   (2006-02-14 14:16) [3]

Ну и ?

TCustomWinSocket имеет метод передачи текста (SendText) и метод приема текста (ReceiveText). Обе твои ф-ции работают как раз с текстом.

В чем проблема ?


 
Интересующийся   (2006-02-15 07:12) [4]

Про TCustomWinSocket верно. :)))

Проблемы нет.

Есть два варианта:
1. (Которорый использую я)

Передаю обработку в отдельный поток (Thread), работа ведется при неблакированном сокете.
Там отлавливаю текст от клиента при помощи TCustomWinSocket внедренный в поток.

Ищу нужную мне инву и обрабатываю ее.

Для обработки авторизации и работы с куками в поток добавляются процедуры и функции чтения и записи куков и проверки авторизации.

P.S
Реализацию при блокированном сокете я не пробовал, поскольку не использую этот режим.

2. (Нежелательный для большинства)
Переписываются TCustomWinSocket и TServerSocket (Добавляются екобходимые процедуры и функции).

Возможно при таком подходе придется переписывать все остальные компоненты с которыми работает TServerSocket.

От этого способа я токазался в виду того, что он трудоемкий (хотя у него есть ряд приимуществ).


 
Digitman ©   (2006-02-15 09:16) [5]


> Передаю обработку в отдельный поток (Thread)


Обработку чего ?
Обрабатывать-то еще нечего !

Ты же сам говоришь, что "Там отлавливаю текст от клиента при помощи TCustomWinSocket" ? Спрашивается, что обрабатывает thread, если от клиента еще не поступили никакие данные ? И что, спрашивается, делается у тебя в обработчиках OnClientRead/Write, вызываемых (как я понял) в основном потоке ?


 
Интересующийся   (2006-02-15 09:38) [6]

OnClientRead/Write у меня неиспользуются.

Я юзаю только OnConnect и OnErrro (неблокированный сокет)

Вся обработка ведется в компоненте являющимся прямым потомком TThread, в который прописан TCustomWinSocke.

Алг. таков:

1. Обрабатываем OnConnect в котором запускаем новый поток и передаем в него сокет.

2. После активизации поток ловит данные из сокета ReceiveTex обрабатывает их и отправляет ответ с помощью SendText и SendBuf().

3. Закрывает сокет.

4. Производит запись в лог.


 
Digitman ©   (2006-02-15 09:48) [7]

Т.е. ты замесил в одну кашу транспортную и прикладную логику.


> ловит данные из сокета ReceiveTex


В цикле ?


> отправляет ответ с помощью SendText и SendBuf()


А если эти методы вернули -1 ?


 
Digitman ©   (2006-02-15 09:56) [8]

Ты концептуально неверно используешь возможности асинхронного неблок. режима гнезда.

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


 
Интересующийся   (2006-02-16 04:57) [9]

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.


 
Интересующийся   (2006-02-16 05:04) [10]

>Digitman ©   (15.02.06 09:48) [7]

>Т.е. ты замесил в одну кашу транспортную и прикладную логику.

>Digitman ©   (15.02.06 09:56) [8]

>Ты концептуально неверно используешь возможности асинхронного неблок. режима гнезда.

Возможно это и так. :(((

Работу в асинхонном режиме при "stThreadBlocking" я знаю только теоретически и напрактике не использует.
Может кто подскажет как правильно реализовать в асинхронном режиме всю работу?

P.S.
Пока мой вариант меня устраивает.


 
Digitman ©   (2006-02-16 08:14) [11]


> Работу в асинхонном режиме при "stThreadBlocking"


Это как раз синхронный режим.

Пример использования TServerSocket в режиме stThreadBlocking есть в проекте scktsrvr.dpr в штатной поставке Делфи.


 
Интересующийся   (2006-02-16 13:31) [12]

> Это как раз синхронный режим.

Как раз это я и хотел написать, асингронный поставил по превычке. :((


 
Digitman ©   (2006-02-16 13:39) [13]

Ты вообще русский ?)



Страницы: 1 вся ветка

Текущий архив: 2006.06.25;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.038 c
15-1148769285
yurik05
2006-05-28 02:34
2006.06.25
Срочно! Помогите раскодировать?


2-1149417399
Whom
2006-06-04 14:36
2006.06.25
canvas


2-1149653166
Rubey
2006-06-07 08:06
2006.06.25
Ошибка с полем MEMO


2-1149766116
alkin
2006-06-08 15:28
2006.06.25
Подскажите пожалуйста, как можно получить все цвета 256-цветной


9-1131538867
VolanD666
2005-11-09 15:21
2006.06.25
Количество теругольников в D3D.