Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2006.06.25;
Скачать: [xml.tar.bz2];

Вниз

Как поставить и прочитать кук при помощи 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.01 c
2-1149345914
НовичОк_
2006-06-03 18:45
2006.06.25
Вставить дату из DateTimePicker


15-1149143398
Игорь Шевченко
2006-06-01 10:29
2006.06.25
Offtopic: Ищется квартира в Москве на предмет снять :)


2-1149591976
Dicot
2006-06-06 15:06
2006.06.25
типизированные файлы


15-1148799490
Kerk
2006-05-28 10:58
2006.06.25
Два вопроса


8-1135810572
MIDI
2005-12-29 01:56
2006.06.25
Как проиграть MIDI ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский