300分!!!如何用Socket向HTTP服务器发送请求和接到响应?(300分)

  • 主题发起人 主题发起人 Writer
  • 开始时间 开始时间
W

Writer

Unregistered / Unconfirmed
GUEST, unregistred user!
最重要的是回答了问题,分不是问题。
 
自己研究一下,可能有用

procedure TForm1.FormCreate(Sender: TObject);
begin
Listen1click(nil);
//i:='0';
end;

procedure TForm1.Listen1Click(Sender: TObject);
begin
Listen1.checked:=not listen1.Checked;
if listen1.Checked then
begin
clientsocket1.Active:=false;
serversocket1.active:=true;
statusbar1.Panels[0].text:='监听中……';
end
else
begin
if serversocket1.Active then
serversocket1.Active:=false;
statusbar1.Panels[0].text:='早就开始了!';
end;

end;

procedure TForm1.Connect1Click(Sender: TObject);
begin
if clientsocket1.Active then clientsocket1.active:=false;
if inputquery('连接到服务器','网络地址',server)
then
if length(server)>0 then
with clientsocket1 do begin
host:=server;
active:=true;
end;
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
statusbar1.Panels[0].text:='连接到服务器 :'+socket.remotehost;
memo1.lines.clear;
memo2.lines.Clear;
end;

procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
memo1.lines.Clear;
memo2.lines.Clear;
end;

procedure TForm1.ServerSocket1Accept(Sender: TObject;
Socket: TCustomWinSocket);
begin
showmessage('成功连接到服务器!');
isserver:=true;
statusbar1.Panels[0].text:='服务器IP:'+socket.remoteaddress;
end;

procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);

//buf1:pchar;
// data1:integer;
begin
if key=VK_return then
begin
if isserver then
begin
data1:=memo1.Lines[memo1.Lines.count-1];

//buf1:=pointer(str);
//len1:=length(str);
//if messagebox(handle,'',pchar('查询窗口'),mb_IconInformation+mb_OKCancel)=mrOK then
serversocket1.socket.connections[0].SendBuf
(pointer(data1)^,length(data1));

//showmessage(data);
end
else
clientsocket1.Socket.sendbuf(pointer(data1)^,length(data1));

//showmessage('数据已经发送成功!!');
//(memo1.lines[memo1.lines.count-1]);
end;
end;

procedure TForm1.Memo2KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
//var str:string;
// buf2:pchar;
// len2:integer;
begin
if key=VK_return then
begin
if isserver then
begin
data2:= memo2.Lines[memo2.Lines.count-1];
//buf2:=pchar(str);
//len2:=length(str);
clientsocket1.Socket.sendbuf
(pointer(data2)^,length(data2));
//showmessage('数据已经发送成功!!');
//memo2.Lines[memo2.Lines.count-1])
//serversocket1.socket.connections[0].sendtext(
end
else
serversocket1.Socket.connections[0].sendbuf
(pointer(data2)^,length(data2));
//showmessage('数据已经发送成功!!');
//memo2.lines[memo2.lines.count-1]);
end;
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
i:integer;
tem: string;


// buf1:pchar;
// len1:integer;
// p:pointer;
begin
//if messagebox(handle,buf1,pchar('查询窗口'),mb_IconInformation+mb_OKCancel)=mrOK then
//temstr:=buf1;showmessage(temstr);
//setlength(aa,Length(data1));
//socket.ReceiveLength );

socket.Receivebuf
(ClintRecData,Length(data1));

//socket.Receivebuf(pointer(aa)^,length(data1));
//data1:=socket.ReceiveText ;

//showmessage(temstr+'@@@@');

//str:=buf1; // 转为字符串
//showmessage(temstr); //字符指针类型即PChar数据类型,
// memo2.Lines.add(data);
//是一个指向以NULL(不是零)字符结尾的字符(Char)串的指针。
//类型T2的值与类型T1的值赋值兼容是指T1和T2允许赋值操作,即:T1:=T2;
//T1是长字符串类型,T2是PChar类型。
for i:=1 to length(data1) do
begin
//log:=ord(data1);// 转为ASICII字符
tem:=tem+IntToHex(ClintRecData,2)+#20;
//aa:=0;
end;
memo2.Lines.add(tem);

end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var //str:string;
i:integer;
tem:string;
// buf2:pchar;
// len2:integer;
begin
socket.receivebuf
(ServerRecData,length(data2));
//memo1.Lines.add(data);

for i:=1 to length(data2) do
begin

tem:=tem+IntToHex(ServerRecData,2)+#20;

end;
memo1.Lines.add(tem);
end;

procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
memo2.Lines.add('不能连接到服务器 :'+server);
Errorcode:=0;
end;
 
如果用d6的话,请跟踪http的Post方法。
 
>>来自:txyx, 时间:2001-12-30 18:22:00, ID:824939
>>自己研究一下,可能有用

对不起,你的东西对我没有用呀。
 



function TForm1.HttpDownLoad(Url, FileName: String): Integer;
const BufferSize = 1024;
var
hHttpSession, hReqUrl: HInternet;
Buffer, Buffer_: Pointer;
NumRead, Buffer_Size, Index: Cardinal;
FileStream: TFileStream;
TotalBytes, TotalSend: Int64;
begin
Result := -1;
Index := 0;
NumRead := 0;
Buffer_Size := 1024;
TotalBytes := 0;
TotalSend := 0;
hHttpSession := InternetOpen ('MyHttp',INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
try
if hHttpSession <> nil then begin
hReqUrl := InternetOpenURL (hHttpSession, PChar(Url), nil, 0,0,0);
try
if hReqUrl <> nil then begin
GetMem(Buffer_,Buffer_Size);
try
if HttpQueryInfo(hReqUrl, HTTP_QUERY_CONTENT_LENGTH , Buffer_, Buffer_Size, Index) then begin
TotalBytes := StrToInt(PChar(Buffer_));
GetMem(Buffer,BufferSize);
FileStream := TFileStream.Create(FileName, fmCreate);
try
repeat
InternetReadFile (hReqUrl, Buffer, BufferSize, NumRead);
if NumRead > 0 then begin
TotalSend := TotalSend + NumRead;
FileStream.Write(Buffer^, NumRead);
end;
until NumRead < BufferSize;
finally
FileStream.Free;
FreeMem(Buffer,BufferSize);
end;
end;
finally
FreeMem(Buffer_);
end;
end else begin
// Do Nothing
end;
finally
InternetCloseHandle(hReqUrl);
end;
end else begin
// Do Nothing
end;
finally
InternetCloseHandle (hHttpSession);
end;

if (TotalBytes = TotalSend) and (TotalSend <> 0) then
Result := 1;
end;
 
设置好80端口,发个Get命令就可以了。。
 
可以参考一下用DELPHI写的Proxy
 
最简单的示例(用telnet):
>telnet www.yahoo.com 80
GET http://www.yahoo.com

记者在发送完请求后有两个回车换行,否则服务器一位命令未结束。
在socket中其他http指令与get相识,可以查一下。
(一般的http服务器不是所有的http指令都支持)
 
还是找http协议资料吧
 
不知道你是不是想要用socket api来做,
我写过一个代理服务器的软件就是接受一方的请求,然后分析请求,取得数据后然后发回去.
不知道你要吗?
 
to whaoye
给我一份datm@21cn.com
 
各位大侠,小弟在这之前有看过HTTP协议,也都明白。

但是问题在于我不懂得用ClientSocket控件实现呀!(小弟太菜)
是用SendText or SendBuf还是其它?还有我试过,SOCKET一定要
用阻塞模式吗?

分不够再加,关键在于解决问题。 希望大家懂的能帮个忙。谢谢。
 
看看我的这个263免费油箱申请对你是否有用
http://www.juntuan.net/vinsa/soft/263signup.zip
有用的话向我要原代码
 
To:vinsa
在这之前可有得误会,我曾经回复过此帖说到你在上面的连接中放了QQSPY这东西在里面,
后来我再试了试,原来是误会,我在在这对你说SORRY。为表歉意,这300分中有50分你的。
再次说SORRY。
 
To:vinsa
在这之前可有得误会,我曾经回复过此帖说到你在上面的连接中放了QQSPY这东西在里面,
后来我再试了试,原来是误会,我在在这对你说SORRY。为表歉意,这300分中有50分你的。
再次说SORRY。
 
To:vinsa
源码如果你肯给的话,发到lzj1105@sina.com
 
看我写的白鸽,就是通过http协议
白鸽0.21(带原程序) 可以通过几十种nt漏洞查看asp源代码

http://fa.fj.cn/fjwdweb/download/download.asp?Did=17
 
To writer:
哦,没关系,我还莫名其妙,我从不用QQspy之类无聊的东西
 
GET /ctitle.jpg HTTP/1.1
Accept: */*
Referer: http://192.168.0.9:7809/
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Host: 192.168.0.9:7809
Connection: Keep-Alive
这是请求的协议!
然后就接受,我编写了一个http server
星期一发布,
http://www.delphibbs.com/delphibbs/dispq.asp?LID=814293
 
Writer,我是看了你在别的地方的牢骚过来的。刚好我做完了一个http的东东。按你的要
求实际上是用socket发一个get或post请求就可以了,前面的大侠经把格式说得很明白
了。用socket函数或是delphi的clientsocket都行。接收就不说了,你还是看完基本的
socket编程的书再说吧。
 
后退
顶部