Форум: "Сети";
Текущий архив: 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