请问delphi中怎么通过socket编写一个模拟的浏览器?(50分)

  • 主题发起人 主题发起人 xiny
  • 开始时间 开始时间
X

xiny

Unregistered / Unconfirmed
GUEST, unregistred user!
请问delphi中怎么通过socket编写一个模拟的浏览器?
请写上例子!谢谢!
实在不好意思!我只有90分了,只能拿50分出来了。
 
什么叫模拟的浏览器?
 
就是通过socket浏览网页!
 
有那么多现成的控件,干吗非要用Soket
 
我要学写socket嘛,所以不想用现成的html控件!
 
佩服.
50分就想搞个编译器啊?
 
不是编译器!
我只是想通过socket来浏览网页!应该不是不难呀!hehe!
 
如果不考虑HTML的解码问题,那么就是HTTP的协议了,不外乎
GET / HTTP/1.1
Accept: application/vnd.ms-excel, application/msword, */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible;
MSIE 4.01;
Windows 98)
之类的命令,看看RFC吧!
 
抱歉说错了.
50分就想搞个解释器啊?
 
to cAkk:帮我看看谢谢!
刚刚我写了一个测试程序!
为什么我不能得到http://localhost/的数据呢?
CSocket1是ClientSocket控件!
procedure TForm1.FormCreate(Sender: TObject);
begin
CSocket1.Host:='localhost';
CSocket1.Port:=80;
CSocket1.Active:=true;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
CSocket1.Socket.SendText('GET /'+#13#10);
end;

procedure TForm1.CSocket1Error(Sender: TObject;
Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
CSocket1.Close;
end;

procedure TForm1.CSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
begin
Memo1.Lines.Add(CSocket1.Socket.ReceiveText);
end;
 

CSocket1.Host:='localhost';

CSocket1.Address:='127.0.0.1';
试一试
可能是DNS的问题.
 
to cAkk:
我改过后试一下,也还是不行!
 
连接成功没有?
 
我先下了,晚上再来.
 
我也不知道有没有连接成功!
你试一下呀,把我的程序拷贝到你的delphi中试试呢?
TForm1 = class(TForm)
CSocket1: TClientSocket;
Memo1: TMemo;
Button1: TButton;
就这几个东东,你试一试呀!谢谢!
 
我的思路:
第一步:
在loadform时:
CSocket1.address:='127.0.0.1';
CSocket1.Port:=80;
CSocket1.Active:=true;
我不知道以上三句是不是就能连上我的本地服务器了!
第二步:
点击butten时:
CSocket1.Socket.SendText('GET / HTTP/1.1'+#13#10);
第二步:
在socket读到数据时:
Memo1.Lines.Add(CSocket1.Socket.ReceiveText);
将socket中的数据写到memo中,
我想应该可以这样办到的,但现在就是读不到数据。可能哪儿不大对!
 

CSocket1.Socket.SendText('GET / HTTP/1.1'+#13#10);

CSocket1.Socket.SendText('GET / HTTP/1.1'+#13#10#13#10);
即两次回车换行表示命令结束. 我不知道HTTP协议是不是这么规定的,
但是通过telnet访问http就需要敲两次回车表示命令结束.
当然,你上面的http命令发送后,得到的肯定是"无效的命令"之类的,
因为你发送的命令格式不对.
改动如下:
procedure TForm1.Button1Click(Sender: TObject);
var lst:tstringlist;
begin
lst:=tstringlist.create;
lst.add('GET / HTTP/1.1');
lst.add('Accept: application/vnd.ms-excel, application/msword, */*');
lst.add('Accept-Language: zh-cn');
lst.add('Accept-Encoding: gzip, deflate');
lst.add('User-Agent: Mozilla/4.0 (compatible;
MSIE 4.01;
Windows 98)');
lst.add('Host: 127.0.0.1');
lst.add('Connection: Keep-Alive');
lst.add('');
//<b>千万别忘了多加一个回车!</b>
CSocket1.Socket.SendText(lst.text);
lst.free;
end;
 
我用你的程序后,还是不对!一点反应都没有!
 
我可是调试通过了才贴出来的噢!
把你的完整代码贴出来吧!
 
我把.pas文件贴出来吧!
unit sock;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ScktComp;
type
TForm1 = class(TForm)
CSocket1: TClientSocket;
Memo1: TMemo;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure CSocket1Error(Sender: TObject;
Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
procedure CSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
CSocket1.host:='localhost';
CSocket1.Port:=80;
CSocket1.Active:=true;
end;

procedure TForm1.Button1Click(Sender: TObject);
{var lst:tstringlist;
}
begin
CSocket1.Socket.SendText('GET / HTTP/1.1'+#13#10#13#10);
{lst:=tstringlist.create;
lst.add('GET / HTTP/1.1');
lst.add('Accept: application/vnd.ms-excel, application/msword, */*');
lst.add('Accept-Language: zh-cn');
lst.add('Accept-Encoding: gzip, deflate');
lst.add('User-Agent: Mozilla/4.0 (compatible;
MSIE 4.01;
Windows 98)');
lst.add('Host: localhost');
lst.add('Connection: Keep-Alive');
lst.add('');
//<b>千万别忘了多加一个回车!</b>
CSocket1.Socket.SendText(lst.text);
lst.free;
}
Memo1.Lines.Add(CSocket1.Socket.ReceiveText);
end;

procedure TForm1.CSocket1Error(Sender: TObject;
Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
CSocket1.Close;
end;

procedure TForm1.CSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
begin
Memo1.Lines.Add(CSocket1.Socket.ReceiveText);
end;

end.
 
后退
顶部