Форум: "Сети";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];
ВнизПосылка Cookies на сервер Найти похожие ветки
← →
0n!k © (2005-08-01 22:52) [0]Как можно реализовать посылку Cookies на сервер? при помощи ClientSocket.
← →
tesseract © (2005-08-01 23:46) [1]Если накатаешь браузер. Cookie- стандарт HTML.
← →
Чапаев © (2005-08-02 10:03) [2]Куки на сервер? Ты сперва разберись, что такое куки, тогда и вопросов таких не будет.
← →
Alexander Panov © (2005-08-02 10:05) [3]Удалено модератором
← →
Alexander Panov © (2005-08-02 10:06) [4]Кукис передаются в заголовке передаваемого запроса в параметре 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
← →
0n!k © (2005-08-02 12:25) [5]я пишу так
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 12:49) [6]ClientSocket1.Active:=true;
ClientSocket1.Open;
дублируют друг друга.
0n!k © (02.08.05 12:25) [5]
и у меня выскакивает вот такая ошибка socket must be in blocking mode
Что это может значить и правельно ли я пишу?
Это означает именно то, что написано в сообщении об ошибке:
Сокет должен быть в режиме stBlocking
← →
Digitman © (2005-08-02 12:49) [7]это значит, что объекты класса TWinSocketStream предназначены для работы совместно с объектами класса TClientSocket, имеющими значение св-ва ClientType НЕ ИНАЧЕ КАК ctBlocking
← →
0n!k © (2005-08-02 13:22) [8]Всеравно не получается, вот код
www.dd666.nm.ru/project.zip
← →
Digitman © (2005-08-02 13:41) [9]
> 0n!k © (02.08.05 13:22) [8]
ну и к чему эта ссылка ?
← →
Alexander Panov © (2005-08-02 13:41) [10]Что не получается?
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?
← →
0n!k © (2005-08-02 14:25) [11]> 2. Зачем для передачи используется TWinSocketStream?
а что можно использовать?
← →
0n!k © (2005-08-02 14:33) [12]А вот так можно?
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.
← →
Alexander Panov © (2005-08-02 14:57) [13]
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;
← →
Alexander Panov © (2005-08-02 14:58) [14]В дополнение.
Надо учесть, что за одно выполнение ReceiveText может быть прянято несколько строк, и логику из [13] изменить в соответствии с этим.
← →
0n!k © (2005-08-02 20:57) [15]В результате был создан вот такой алгоритм.
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 22:42) [16]Что ж ты с кодом как следует не разобрался?
Там ошибка, как я сейчас обнаружил.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;
- убери.
← →
Alexander Panov © (2005-08-03 00:49) [17]А вообще, в этом форуме уже были примеры.
Например, здесь:
http://delphimaster.net/view/6-1122031924/
← →
0n!k © (2005-08-03 14:30) [18]Alexander Panov ОГРОМНОЕ СПАСИБО!!
Супер чел!
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.036 c