📄 1880734[1].html
字号:
<HTML><HEAD><META charset="gb2312">
<LINK REL=stylesheet HREF="../dfw.css" TYPE="text/css">
<title>如何用TClientSocket实现对http服务器发POST请求???csdn一周多了上无人回答. </title>
</HEAD>
<BODY>
<B>话题1880734的标题是:</B>
如何用TClientSocket实现对http服务器发POST请求???csdn一周多了上无人回答.
(100分)<br>
<B>分类:</B>Internet/TCPIP
<table width="100%" cellpadding="4">
<tr class="作者栏"><TD>
Benesoft
(2003-05-21 10:32:00)
</td></tr><tr><td><p>
如何用TClientSocket实现对http服务器发POST请求??<br>
csdn上的问题:<br>
http://expert.csdn.net/Expert/topic/1777/1777223.xml?temp=.6323358<br>
不要使用indy之类的控件,我要用TClientSocket实现,当然能用socket API编程实现也可,<br>
另外不要用网上或书的一些例子,那些都不行,用不了,大部分是HTTP没有回映.<br>
我被这个问题闷了蛮久了,特来问大家...[:D]<br>
希望给出具体的源程序...
</td></tr>
</table>
<table width="100%" cellpadding="4">
<tr class="作者栏"><TD>
LiChaoHui
(2003-05-22 16:50:00)
</td></tr><tr><td><p>
HTTP 1.0 的请求头有特定的格式,<br>
你可以拦截一个,然后对其中的部分内容进行更改,<br>
然后用Socket直接发送出去,之后,等待并接受内容就可以了
</td></tr>
</table>
<table width="100%" cellpadding="4">
<tr class="作者栏"><TD>
Benesoft
(2003-05-23 16:55:00)
</td></tr><tr><td><p>
终于有人说话了。<br>
那些格式都搞定了。异步方式现在我也实现了,但同步方式就不会了,总是收到了,原因<br>
不明?
</td></tr>
</table>
<table width="100%" cellpadding="4">
<tr class="作者栏"><TD>
sforever
(2003-05-24 14:02:00)
</td></tr><tr><td><p>
我也不懂。帮你顶一下
</td></tr>
</table>
<table width="100%" cellpadding="4">
<tr class="作者栏"><TD>
张无忌
(2003-05-24 17:55:00)
</td></tr><tr><td><p>
直接发字符串就可以了,
</td></tr>
</table>
<table width="100%" cellpadding="4">
<tr class="作者栏"><TD>
Benesoft
(2003-05-26 9:07:00)
</td></tr><tr><td><p>
晕!什么回答。
</td></tr>
</table>
<table width="100%" cellpadding="4">
<tr class="作者栏"><TD>
phpexpert
(2003-05-26 15:00:00)
</td></tr><tr><td><p>
我再这里也问过类似问题,很久没人回答,关注,期待回答<br>
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1821496<br>
</td></tr>
</table>
<table width="100%" cellpadding="4">
<tr class="作者栏"><TD>
Benesoft
(2003-05-26 17:33:00)
</td></tr><tr><td><p>
通讯都解决了。但用是的异步方式,因为这种方式不好控制。<br>
现要使用同步方式,晕啊,搞不定。。。
</td></tr>
</table>
<table width="100%" cellpadding="4">
<tr class="作者栏"><TD>
Benesoft
(2003-05-26 17:38:00)
</td></tr><tr><td><p>
to phpexpert 你这个好解决。"GET /login.asp?usrname=abc&pwd= HTTP1.1 '.<br>
就行了,这是关键的一句.其他的一些报头是不能省的.<br>
POST只是将参数放在报头之后.
</td></tr>
</table>
<table width="100%" cellpadding="4">
<tr class="作者栏"><TD>
phpexpert
(2003-05-26 18:31:00)
</td></tr><tr><td><p>
呵呵,关键是连接如何创建不知道哦。<br>
能给点关键代码吗?创建socket连接,发送http命令给服务器<br>
:-)
</td></tr>
</table>
<table width="100%" cellpadding="4">
<tr class="作者栏"><TD>
phpexpert
(2003-05-26 18:58:00)
</td></tr><tr><td><p>
看了一下你在csdn上的代码,尝试着使用,还是不行<br>
<br>
获得不了内容
</td></tr>
</table>
<table width="100%" cellpadding="4">
<tr class="作者栏"><TD>
Benesoft
(2003-05-27 8:02:00)
</td></tr><tr><td><p>
那是所谓的同步方式,不行。应为这样:<br>
var<br>
cs:TClientSocket;<br>
CR:string;<br>
begin<br>
CR:=#13+#10;<br>
cs := TClientSocket.Create(self);<br>
cs.Address := '127.0.0.1';<br>
cs.ClientType := ctBlocking;<br>
cs.Port := 80;<br>
cs.Active := true;<br>
cs.Socket.SendText('GET /default.htm HTTP/1.1'+CR);<br>
cs.Socket.SendText('Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*'+CR);<br>
cs.Socket.SendText('Accept-Language: zh-cn'+CR);<br>
cs.Socket.SendText('Accept-Encoding: gzip, deflate'+CR);<br>
cs.Socket.SendText('User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)'+CR);<br>
cs.Socket.SendText('Host: 127.0.0.1:80'+CR);<br>
cs.Socket.SendText('Connection: Keep-nonAlive'+CR);<br>
cs.Socket.SendText(CR);<br>
cs.Socket.SendText('Connection: Keep-nonAlive'+CR);<br>
cs.Socket.SendText(CR);<br>
end<br>
<br>
然后在TClientSocket的onRead事件中写入:(关键)<br>
memo1.Lines.Add(cs.Socket.ReceiveText());<br>
即可。
</td></tr>
</table>
<table width="100%" cellpadding="4">
<tr class="作者栏"><TD>
phpexpert
(2003-05-27 10:04:00)
</td></tr><tr><td><p>
程序里tclientsocket是create生成的,它有onread事件吗?请教,多谢[?]
</td></tr>
</table>
<table width="100%" cellpadding="4">
<tr class="作者栏"><TD>
Benesoft
(2003-05-27 10:10:00)
</td></tr><tr><td><p>
有呀。如果你是用代码方式生成组件。那估计不好办了。因为那样要用同步方式。这个地方我就是无法解决。
</td></tr>
</table>
<table width="100%" cellpadding="4">
<tr class="作者栏"><TD>
张无忌
(2003-05-27 10:15:00)
</td></tr><tr><td><p>
异步效率高,不过你上面的那个代码够垃圾的[:D]
</td></tr>
</table>
<table width="100%" cellpadding="4">
<tr class="作者栏"><TD>
Benesoft
(2003-05-27 10:21:00)
</td></tr><tr><td><p>
效率高那是肯定的。但有时有许多问题。不能异步。。<br>
垃圾是有点垃圾。那些我只是从IE的报头中得到的。于是我就给搞下来了。<br>
真正有用就是第一句:“GET。。。。。”
</td></tr>
</table>
<table width="100%" cellpadding="4">
<tr class="作者栏"><TD>
张无忌
(2003-05-27 10:23:00)
</td></tr><tr><td><p>
我搞了这么久的winsock,还不知道什么是不能异步?<br>
</td></tr>
</table>
<table width="100%" cellpadding="4">
<tr class="作者栏"><TD>
Benesoft
(2003-05-27 10:26:00)
</td></tr><tr><td><p>
天,说到这里就不好玩了。。。。<br>
我只是说我需要用同步方式解决。。。。<br>
其实。。。。<br>
也不想说了。。。<br>
</td></tr>
</table>
<table width="100%" cellpadding="4">
<tr class="作者栏"><TD>
张无忌
(2003-05-27 10:31:00)
</td></tr><tr><td><p>
你要做的用异步一样解决,速度还要快一点,而且你不用写线程啊,为什么要同步了?
</td></tr>
</table>
<table width="100%" cellpadding="4">
<tr class="作者栏"><TD>
张无忌
(2003-05-27 10:33:00)
</td></tr><tr><td><p>
做这个最适合用wininet函数, 他支持https,方便快界!
</td></tr>
</table>
<table width="100%" cellpadding="4">
<tr class="作者栏"><TD>
phpexpert
(2003-05-27 10:35:00)
</td></tr><tr><td><p>
我的代码如下,但是memo1中并没有任何反馈信息,不知道是什么问题?<br>
如果我点了多次button,它会提示主机放弃一个已连接的连接。<br>
恳请指教~~<br>
<br>
unit Unit1;<br>
<br>
interface<br>
<br>
uses<br>
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,<br>
Dialogs, ScktComp, StdCtrls;<br>
<br>
type<br>
TForm1 = class(TForm)<br>
Button1: TButton;<br>
Memo1: TMemo;<br>
ClientSocket1: TClientSocket;<br>
procedure Button1Click(Sender: TObject);<br>
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);<br>
private<br>
{ Private declarations }<br>
public<br>
{ Public declarations }<br>
end;<br>
<br>
var<br>
Form1: TForm1;<br>
<br>
implementation<br>
<br>
{$R *.dfm}<br>
<br>
procedure TForm1.Button1Click(Sender: TObject);<br>
var<br>
CR:string;<br>
begin<br>
CR:=#13+#10;<br>
//ClientSocket1.Address := '192.168.0.15';<br>
ClientSocket1.ClientType := ctBlocking;<br>
ClientSocket1.Port := 9019;<br>
ClientSocket1.Active := true;<br>
ClientSocket1.Socket.SendText('post /login HTTP/1.1'+CR);<br>
ClientSocket1.Socket.SendText('Accept:*/*'+CR);<br>
ClientSocket1.Socket.SendText('Accept-Language: zh-cn'+CR);<br>
ClientSocket1.Socket.SendText('referer:http://192.168.0.15/login'+CR);<br>
ClientSocket1.Socket.SendText('Content-type:application/x-www-form-urlencoded'+CR);<br>
ClientSocket1.Socket.SendText('User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)'+CR);<br>
ClientSocket1.Socket.SendText('Host: 192.168.0.15:9019'+CR);<br>
ClientSocket1.Socket.SendText('Content-length:16'+CR);<br>
ClientSocket1.Socket.SendText('Connection: Keep-Alive'+CR);<br>
ClientSocket1.Socket.SendText(CR);<br>
end;<br>
<br>
procedure TForm1.ClientSocket1Read(Sender: TObject;<br>
Socket: TCustomWinSocket);<br>
begin<br>
memo1.Lines.Add(ClientSocket1.Socket.ReceiveText);<br>
end;<br>
<br>
end.
</td></tr>
</table>
<table width="100%" cellpadding="4">
<tr class="作者栏"><TD>
Benesoft
(2003-05-27 10:35:00)
</td></tr><tr><td><p>
WinInet我用了。但Post请求不知如何发送?
</td></tr>
</table>
<table width="100%" cellpadding="4">
<tr class="作者栏"><TD>
张无忌
(2003-05-27 10:36:00)
</td></tr><tr><td><p>
memo1.Lines.Add(ClientSocket1.Socket.ReceiveText);<br>
你用组塞,上面就什么都受不到的
</td></tr>
</table>
<table width="100%" cellpadding="4">
<tr class="作者栏"><TD>
phpexpert
(2003-05-27 10:36:00)
</td></tr><tr><td><p>
to 张无忌:我看到你回答很多类似问题,都推荐使用wininet。我查了些资料,但是没看懂。不知道能否提供一个例子,只要连接就行,ok?3ks
</td></tr>
</table>
<table width="100%" cellpadding="4">
<tr class="作者栏"><TD>
Benesoft
(2003-05-27 10:36:00)
</td></tr><tr><td><p>
属性的设置,<br>
天啦,不得了。<br>
我又要QQ。<br>
又要BBS。<br>
又要手机回女友的短信。<br>
还有写java代码。。。<br>
</td></tr>
</table>
<table width="100%" cellpadding="4">
<tr class="作者栏"><TD>
phpexpert
(2003-05-27 10:37:00)
</td></tr><tr><td><p>
那应该选cNonblocking?我也尝试着选了,还是不正确,其他不用修改吗?[?]
</td></tr>
</table>
<table width="100%" cellpadding="4">
<tr class="作者栏"><TD>
张无忌
(2003-05-27 10:37:00)
</td></tr><tr><td><p>
都CSDN上找,上面有现成的代码,我也是用他的代码再参考MSDN来做的
</td></tr>
</table>
<table width="100%" cellpadding="4">
<tr class="作者栏"><TD>
Benesoft
(2003-05-27 10:38:00)
</td></tr><tr><td><p>
呀呀呀,,这里中午来搞。。。。
</td></tr>
</table>
<table width="100%" cellpadding="4">
<tr class="作者栏"><TD>
phpexpert
(2003-05-27 10:38:00)
</td></tr><tr><td><p>
csdn?我去看看,不行再来麻烦你,谢谢张无忌 [:D]
</td></tr>
</table>
<table width="100%" cellpadding="4">
<tr class="作者栏"><TD>
phpexpert
(2003-05-27 23:18:00)
</td></tr><tr><td><p>
还是没搞定,继续学习,等待
</td></tr>
</table>
<table width="100%" cellpadding="4">
<tr class="作者栏"><TD>
phpexpert
(2003-05-29 16:52:00)
</td></tr><tr><td><p>
问题已解决。我用的nonblocking方式,主要就是参数如何传递的问题。
</td></tr>
</table>
<table width="100%" cellpadding="4">
<tr class="作者栏"><TD>
LiChaoHui
(2003-05-30 8:31:00)
</td></tr><tr><td><p>
ICS里面有个HttpCli的组件,是个Http客户端组件,<br>
支持Post, Get, Put
</td></tr>
</table>
<table width="100%" cellpadding="4">
<tr class="作者栏"><TD>
gongji
(2003-05-31 14:45:00)
</td></tr><tr><td><p>
LiChaoHui对的
</td></tr>
</table>
<table width="100%" cellpadding="4">
<tr class="作者栏"><TD>
phpexpert
(2003-06-01 13:55:00)
</td></tr><tr><td><p>
试试看先
</td></tr>
</table>
<table width="100%" cellpadding="4">
<tr class="作者栏"><TD>
phpexpert
(2003-06-01 22:41:00)
</td></tr><tr><td><p>
基本都已经解决,不用其他控件解决最好.<br>
还有一个问题,想请教clientsocket连接上serversocket以后,有默认断开时间吗?<br>
<br>
知道这个得,拿分来这里<br>
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1821496
</td></tr>
</table>
<table width="100%" cellpadding="4">
<tr class="作者栏"><TD>
phpexpert
(2003-06-07 9:39:00)
</td></tr><tr><td><p>
这位楼主怎么不来了?打算不打算结贴了呢?
</td></tr>
</table>
<table width="100%" cellpadding="4">
<tr class="作者栏"><TD>
Benesoft
(2003-06-07 9:42:00)
</td></tr><tr><td><p>
结。
</td></tr>
</table>
<table width="100%" cellpadding="4">
<tr class="作者栏"><TD>
Benesoft
(2003-06-07 9:43:00)
</td></tr><tr><td><p>
多人接受答案了。
</td></tr>
</table>
<p>gongji-10,LiChaoHui-10,phpexpert-20,sforever-10,张无忌-50,的回答最终被接受。
</BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -