![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Посылка Cookies на сервер [D7, WinXP]
0n!k © (2005-08-01 22:52:00)Как можно реализовать посылку Cookies на сервер? при помощи ClientSocket.
0n!k (2005-08-03 14:30:00) [1]Alexander Panov ОГРОМНОЕ СПАСИБО!!
Супер чел!
Alexander Panov (2005-08-03 00:49:00) [2]А вообще, в этом форуме уже были примеры.
Например, здесь:
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1122031924&n=4
Alexander Panov (2005-08-02 22:42:00) [3]Что ж ты с кодом как следует не разобрался?
Там ошибка, как я сейчас обнаружил.
Repeat
Len := Socket.ReceiveLength;
Tmp:=Tmp+Socket.ReceiveText;
EndStr := Pos(#13#10,Tmp);
if EndStr>0 then
begin
Memo2.Lines.Add('I?eiyoa no?iea:'+ Copy(Tmp,1,EndStr-1));
Delete(Tmp,1,EndStr+1);
end;
until Len=0;
Len := Socket.ReceiveLength;
нужно вынести за пределы цикла.
Len := Socket.ReceiveLength;
Repeat
Tmp:=Tmp+Socket.ReceiveText;
EndStr := Pos(#13#10,Tmp);
if EndStr>0 then
begin
Memo2.Lines.Add('I?eiyoa no?iea:'+ Copy(Tmp,1,EndStr-1));
Delete(Tmp,1,EndStr+1);
end;
until Len=0;
Socket.Free;- убери.
0n!k (2005-08-02 20:57:00) [4]В результате был создан вот такой алгоритм.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,ScktComp, StdCtrls, Spin;
type
TForm1 = class(TForm)
ClientSocket1: TClientSocket;
Button2: TButton;
Memo1: TMemo;
Edit1: TEdit;
Edit3: TEdit;
SpinEdit1: TSpinEdit;
Memo2: TMemo;
procedure Button2Click(Sender: TObject);
procedure ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
procedure ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Tmp:string;
implementation
{$R *.dfm}
procedure TForm1.Button2Click(Sender: TObject);
begin
ClientSocket1.Host:=edit1.Text;
ClientSocket1.port:=SpinEdit1.Value;
ClientSocket1.Open;
end;
procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Socket.SendText(memo1.Lines.text+#13#10);
end;
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
Len: Integer;
EndStr: Integer;
begin
Repeat
Len := Socket.ReceiveLength;
Tmp:=Tmp+Socket.ReceiveText;
EndStr := Pos(#13#10,Tmp);
if EndStr>0 then
begin
Memo2.Lines.Add('Ïðèíÿòà ñòðîêà:'+ Copy(Tmp,1,EndStr-1));
Delete(Tmp,1,EndStr+1);
end;
until Len=0;
Socket.Free;
end;
procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
ShowMessage(Tmp);
end;
end.
Я запускаю и происходит отправление сообщения, но оно не прекращается! как, сделать сокету timeout, чтобы программа могла спокойно считать ответ с сервера.
Alexander Panov (2005-08-02 14:58:00) [5]В дополнение.
Надо учесть, что за одно выполнение ReceiveText может быть прянято несколько строк, и логику из [13] изменить в соответствии с этим.
Alexander Panov (2005-08-02 14:57:00) [6]
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
begin
Tmp:=Tmp+Socket.ReceiveText;
end;
здесь надо проверять, все ли данные выбраны из буфера, и строку tmp проверять на флажок - окончание строки, например, #13#10.
Примерно так:
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
Len: Integer;
EndStr: Integer;
begin
Repeat
Len := Socket.ReceiveLength;
Tmp:=Tmp+Socket.ReceiveText;
EndStr := Pos(#13#10,Tmp);
if EndStr>0 then
begin
Memo1.Lines.Add('Принята строка:'+ Copy(Tmp,1,EndStr-1));
Delete(Tmp,1,EndStr+1);
end;
until Len=0;
end;
0n!k (2005-08-02 14:33:00) [7]А вот так можно?
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,ScktComp, StdCtrls, Spin;
type
TForm1 = class(TForm)
ClientSocket1: TClientSocket;
Button2: TButton;
Memo1: TMemo;
Edit1: TEdit;
Edit3: TEdit;
SpinEdit1: TSpinEdit;
procedure Button2Click(Sender: TObject);
procedure ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
procedure ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Tmp:string;
implementation
{$R *.dfm}
procedure TForm1.Button2Click(Sender: TObject);
begin
edit3.Text:='No';
ClientSocket1.Host:=edit1.Text;
ClientSocket1.port:=SpinEdit1.Value;
ClientSocket1.Open;
end;
procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Socket.SendText(memo1.Lines.text+#13#10);
end;
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
begin
Tmp:=Tmp+Socket.ReceiveText;
end;
procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
ShowMessage(Tmp);
end;
end.
0n!k (2005-08-02 14:25:00) [8]> 2. Зачем для передачи используется TWinSocketStream?
а что можно использовать?
Alexander Panov (2005-08-02 13:41:00) [9]Что не получается?
1. сразу явная ошибка;
Неправилно:
logined:=memo1.Lines[i]+#13;
mySocket.Write(logined, Length(memo1.Lines.text));
Нужнго:
logined:=memo1.Lines[i]+#13;
mySocket.Write(logined [1], Length(logined));
2. Зачем для передачи используется TWinSocketStream?
Digitman (2005-08-02 13:41:00) [10]
> 0n!k © (02.08.05 13:22) [8]
ну и к чему эта ссылка ?
0n!k (2005-08-02 13:22:00) [11]Всеравно не получается, вот код
www.dd666.nm.ru/project.zip
Digitman (2005-08-02 12:49:00) [12]это значит, что объекты класса TWinSocketStream предназначены для работы совместно с объектами класса TClientSocket, имеющими значение св-ва ClientType НЕ ИНАЧЕ КАК ctBlocking
Alexander Panov (2005-08-02 12:49:00) [13]ClientSocket1.Active:=true;
ClientSocket1.Open;
дублируют друг друга.
0n!k © (02.08.05 12:25) [5]
и у меня выскакивает вот такая ошибка socket must be in blocking mode
Что это может значить и правельно ли я пишу?
Это означает именно то, что написано в сообщении об ошибке:
Сокет должен быть в режиме stBlocking
0n!k (2005-08-02 12:25:00) [14]я пишу так
var
c: Char;
MySocket: TWinSocketStream;
logined: string; i:integer;
Socket: TCustomWinSocket;
begin
MySocket := TWinSocketStream.Create(Socket, 60000);
edit3.Text:='No';
ClientSocket1.Host:=edit1.Text;
ClientSocket1.port:=SpinEdit1.Value;
ClientSocket1.Active:=true;
ClientSocket1.Open;
for i:=0 to 15 do
begin
logined:=memo1.Lines[i]+#13;
mySocket.Write(logined, Length(memo1.Lines.text));
end;
while not MySocket.WaitForData(100) do
Application.ProcessMessages;
if MySocket.Read(c, 1)=1 then
edit3.Text:='Yes';
MySocket.Free;
end;
end.
в memo находится такой запрос
POST /login.php HTTP/1.1
Host: www.уу.ru
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Accept: text/xml,application/xml,application/xhtml+xml,text/
html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-us
Accept-Charset: windows-1251,utf-8,iso-8859-1;q=0.3,*;q=0.1
Keep-Alive: 300
Referer: http://уу/login.php
Cookie: phpbb2mysql_data=a%3A0%3A%7B%7D;
phpbb2mysql_sid=cff8b0b526a221553bc23ee57a8daee4
Content-Type: application/x-www-form-urlencoded
Content-Length: 54
Connection: keep-alive
Accept-Encoding: gzip,deflate
TE: gzip,deflate
и у меня выскакивает вот такая ошибка socket must be in blocking mode
Что это может значить и правельно ли я пишу?
Alexander Panov (2005-08-02 10:06:00) [15]Кукис передаются в заголовке передаваемого запроса в параметре Cookie:
GET http://my_site.ru/cgi-bin/getforum.pl?HTTP/1.1
Accept: */*
Accept-Language: ru
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Host: my_site.ru
Proxy-Connection: Keep-Alive
Cookie: name=My_Name; password=My_Password
Alexander Panov (2005-08-02 10:05:00) [16]Удалено модератором
Чапаев (2005-08-02 10:03:00) [17]Куки на сервер? Ты сперва разберись, что такое куки, тогда и вопросов таких не будет.
tesseract (2005-08-01 23:46:00) [18]Если накатаешь браузер. Cookie- стандарт HTML.