高分求救,用ClientSocket1发送http协议的字符串(50分)

  • 主题发起人 主题发起人 zhousi
  • 开始时间 开始时间
Z

zhousi

Unregistered / Unconfirmed
GUEST, unregistred user!
Stream := TWinSocketStream.Create(pclientf.ClientSocket1.Socket, 30000);
Buffer:=pchar(pclientf.Edit3.Text); //所要发送的字符串
head:='POST http://222.1.5.212:8080 HTTP/1.0'+#13+#10; //www.rtfm.be
head:=head+'Accept: */*'+#13+#10;
head:=head+'Content-Type: application/x-www-form-urlencoded'+#13+#10;
head:=head+'User-Agent: Mozilla/3.0(compatible)'+#13+#10;
head:=head+'Host: 222.1.5.212'+#13+#10;
head:=head+'Content-Length: ' + inttostr(length(Buffer))+#13+#10;
pclientf.ClientSocket1.Socket.SendText(head);
alllen:=length(Buffer) div 8192;
i:=0;
while (i<alllen+1) do
begin
if i=alllen then
Stream.WriteBuffer((buffer+i*8192)^,length(Buffer)-i*8192)
else
Stream.WriteBuffer((buffer+i*8192)^,8192);
i:=i+1;
end;
请高手帮忙看看,怎么修改上面程序!
 
增加两行
ClientSocket1.host:="222.1.5.212";
clientsocket1.port:=8080;

改一行
head:='POST / HTTP/1.0'+#13+#10; //www.rtfm.be

去一行
head:=head+'Content-Length: ' + inttostr(length(Buffer))+#13+#10;

再建议,先看去看HTTP RFC文档,你POST出去的数据格式都不对
 
tp 枫
增加两行
ClientSocket1.host:="222.1.5.212";
clientsocket1.port:=8080;
改一行
head:='POST / HTTP/1.0'+#13+#10; //www.rtfm.be
---------我想了一下,你想的应该是直接连接socketserver,而我的是通过代理服务器
连接的,所以我用socketclient和我的代理服务器connect,然后向目标server发送数据
那么head中应该还要有目标server的ip地址,不然代理怎么知道发送到什么地方!

去一行
head:=head+'Content-Length: ' + inttostr(length(Buffer))+#13+#10;
-----这是想服务器发送数据的长度,能不要吗?不知道!--请指点一下

再建议,先看去看HTTP RFC文档,你POST出去的数据格式都不对
---------倒,全是英文的,看了好费力,不过我在努力看!那东西太重要了,可要是有
中文的就好了:)
 
http://www.china-pub.com/computers/eMook/emooknew/RFC/rfc.asp
找到个好地方,哇有,rcf1945(http1.0) 还有好多中问的rcf呀
rcf2616(http1.1)的中文还没出来!!呵呵!!
 
今天DFW是怎么回事,我回了两次都没有贴上。再贴一次

我想了一下,你想的应该是直接连接socketserver,而我的是通过代理服务器
连接的,所以我用socketclient和我的代理服务器connect,然后向目标server发送数据
那么head中应该还要有目标server的ip地址,不然代理怎么知道发送到什么地方!
--------------
其实代理服务器只是把你的请求头截下来,自己再重新请求一次,接收到内容后,再转发到你的clientsocket上去


这是想服务器发送数据的长度,能不要吗?不知道!--请指点一下

--------------
你是请求数据,所以不需要发送数据长度


倒,全是英文的,看了好费力,不过我在努力看!那东西太重要了,可要是有
中文的就好了:)
--------------------
呵呵,这问我本想告诉你在那里可以找到的,谁知道你自己先找到了。

 
1。其实代理服务器只是把你的请求头截下来,自己再重新请求一次,接收到内容后,
再转发到你的clientsocket上去
----那就是说:head:='POST http://222.1.5.212:8080 HTTP/1.0'+#13+#10; 这一句不用
改咯!:)
2。你是请求数据,所以不需要发送数据长度
---什么意思呀!我是想post数据到socketserver呀!我看肯定要
3。你有没有发现Stream := TWinSocketStream.Create(pclientf.ClientSocket1.Socket, 30000);
也有问题呀!这句好象这有在阻塞模式下,有用呀!
---不知道怎么写发送的语句!能不能,写个完整的发送post的soctetclient端程序给我,
(我的所有分都给你)
4。我也写了soketserver段,用控件ServerSocket1。客户端用http协议post数据结果,在
ServerSocket1。onwrite中只能收到
:POST / HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/3.0 (compatible)
Host: 222.1.12.2
Content-Length: 112
而收不到发过来的字符串数据
但,我用单步调试时,却以外的发现,多了一行,如下:是数据,晕!
ID=27313&REMITE=francois%2Epiette%40pophost%2Eeunet%2Ebe&MENSAJE=HELLO+WORLD+
%21+%28MESSAGE+SENT+BY+HTTPPG%29%2E
为什么,非得调试才能收到数据

 
查点忘了贴收的程序了!
procedure TForm1.ServerSocket1ClientWrite(Sender: TObject;
Socket: TCustomWinSocket);
var
re:pchar;
sbuf:string;
relong:integer;
begin
re:=nil;
while Socket.ReceiveLength>0 do
begin
//申请内存
re:=AllocMem(Socket.receivelength);
TRY
relong:=Socket.ReceiveLength;
Socket.ReceiveBuf(re^,Socket.receivelength);
sBuf:=strpas(re);
Setlength(sbuf,relong);
FINALLY
freemem(re);
END;
Form1.Memo1.Lines.Add(sbuf);
end;
end;
 
var
postcontent:Tstringlist;
begin
postcontent:=Tstringlist.create;
postcontent.add('POST / HTTP/1.0');
postcontent.add('Accept: */*');
postcontent.add('Content-Type: application/x-www-form-urlencoded');
postcontent.add('Host: 222.1.5.212');
postcontent.add('');
postcontent.text:=postcontent.text+pclientf.Edit3.Text;
clientstocket.host:='222.1.5.212';
clientsocket.port:=8080;
clientsocket.Connect;
clientsocket.socket.SendText(postcontent.text);//发送内容

................
读取返回数据.............
...............

postcontent.free;
end;

大概意思就是这样的,你看看,有什么问题再问。
 
1。在没有代理的时候测试通过!谢谢:)(晚上我找环境再测试一下,在http代理服务器
下的,你的意思,是不是让ClientSocket1.address:=要访问的地址,而不是代理服务器的
地址呀呀!)
2。能不能改一下,换成发送流的呢?
3。分是给定你了,你开口说吧,要多少!!(申请n个号,然后给你分,也要喂饱你,呵呵)
 
通过代理服务器的测试成功!!呵呵!
谢谢你!!
下一步,就是看看,怎么发流的数据了!呵呵!!!
 
是不是把clientsocket.socket.SendText(postcontent.text);//发送内容
中的postcontent.text转换成流!
然后用ClientSocket1.Socket.SendStream
或postcontent.text转换成buf
ClientSocket1.Socket.SendBuf
 
我也没有试过转送流,但原理总是一样的
BTW:我看了你说的,不明白你传流怎么回事。你是想把POST的数据(不是请求头)用流的方式
传送是吗?,如果你是想按HTTP的标准做,那你的方法就不对了。有一个RFC文档是讲述
这个转送标准的。
 
有空,联系联系,我的qq:5326989
email:zhouhj@mail.716.com.cn
 
后退
顶部