日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁(yè) > 編程 > Delphi > 正文

用DELPHI設(shè)計(jì)代理服務(wù)器程序

2019-11-18 18:53:24
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
 

用Delphi設(shè)計(jì)自己的代理服務(wù)器

    筆者在編寫一個(gè)上網(wǎng)計(jì)費(fèi)軟件時(shí),涉及到如何對(duì)局域網(wǎng)中各工作站上網(wǎng)計(jì)費(fèi)問(wèn)題。一般來(lái)講,這些工作站通過(guò)代理服務(wù)器上網(wǎng),而采用現(xiàn)成的代理服務(wù)器軟件時(shí),由于代理服務(wù)器軟件是封閉的系統(tǒng),很難編寫程序獲取實(shí)時(shí)的上網(wǎng)計(jì)時(shí)信息。因此,考慮是否能編寫自己的代理服務(wù)器,一方面解決群體上網(wǎng),另一方面又解決上網(wǎng)的計(jì)費(fèi)問(wèn)題呢?
    經(jīng)過(guò)實(shí)驗(yàn)性編程,終于圓滿地解決了該問(wèn)題。現(xiàn)寫出來(lái),與各位同行分享。

1、 思路
當(dāng)前流行的瀏覽器的系統(tǒng)選項(xiàng)中有一個(gè)參數(shù),即“通過(guò)代理服務(wù)器連接”,經(jīng)過(guò)編程測(cè)
試,當(dāng)局域網(wǎng)中一臺(tái)工作站指定了該屬性,再發(fā)出Internet請(qǐng)求時(shí),請(qǐng)求數(shù)據(jù)將發(fā)送到所指定的代理服務(wù)器上,以下為請(qǐng)求數(shù)據(jù)包示例:
                 GET http://home.microsoft.com/intl/cn/ HTTP/1.0
                 Accept: */*
                 Accept-Language: zh-cn
                 Accept-Encoding: gzip, deflate
                 User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows NT)
                 Host: home.microsoft.com
                 PRoxy-Connection: Keep-Alive
其中第一行為目標(biāo)URL及相關(guān)方法、協(xié)議,“Host”行指定了目標(biāo)主機(jī)的地址。
由此知道了代理服務(wù)的過(guò)程:接收被代理端的請(qǐng)求、連接真正的主機(jī)、接收主機(jī)返回的數(shù)據(jù)、將接收數(shù)據(jù)發(fā)送到被代理端。
為此可編寫一個(gè)簡(jiǎn)單的程序,完成上述網(wǎng)絡(luò)通信重定向問(wèn)題。
用Delphi設(shè)計(jì)時(shí),選用ServerSocket作為與被代理工作站通信的套接字控件,選用ClientSocket動(dòng)態(tài)數(shù)組作為與遠(yuǎn)程主機(jī)通信的套接字控件。
編程時(shí)應(yīng)解決的一個(gè)重要問(wèn)題是多重連接處理問(wèn)題,為了加快代理服務(wù)的速度和被代理端的響應(yīng)速度,套接字控件的屬性應(yīng)設(shè)為非阻塞型;各通信會(huì)話與套接字動(dòng)態(tài)綁定,用套接字的SocketHandle屬性值確定屬于哪一個(gè)會(huì)話。
通信的銜接過(guò)程如下圖所示:

                                  代理服務(wù)器
                                 
                                  Serversocket
                        (1)          接  收
         被代理端                   發(fā)  送                        遠(yuǎn)程主機(jī)
                        (6)        (2)      (5)
         Browser                  ClientSocket       (4)            Web Server
                                    接  收
                                    發(fā)  送          (3)


(1)、被代理端瀏覽器發(fā)出Web請(qǐng)求,代理服務(wù)器的Serversocket接收到請(qǐng)求。
(2)、代理服務(wù)器程序自動(dòng)創(chuàng)建一個(gè)ClientSocket,并設(shè)置主機(jī)地址、端口等屬性,然后連接遠(yuǎn)程主機(jī)。
(3)、遠(yuǎn)程連通后激發(fā)發(fā)送事件,將Serversocket接收到的Web請(qǐng)求數(shù)據(jù)包發(fā)送到遠(yuǎn)程主機(jī)。
(4)、當(dāng)遠(yuǎn)程主機(jī)返回頁(yè)面數(shù)據(jù)時(shí),激發(fā)ClientSocket的讀事件,讀取頁(yè)面數(shù)據(jù)。
(5)、代理服務(wù)器程序根據(jù)綁定信息確定屬于ServerSocket控件中的哪一個(gè)Socket應(yīng)該將從主機(jī)接收的頁(yè)面信息發(fā)送到被代理端。
(6)、ServerSocket中的對(duì)應(yīng)Socket將頁(yè)面數(shù)據(jù)發(fā)送到被代理端。

2、 程序編寫
使用Delphi設(shè)計(jì)以上通信過(guò)程非常簡(jiǎn)單,主要是ServerSocket、ClientSocket的相關(guān)事
件驅(qū)動(dòng)程序的程序編寫。下面給出作者編寫的實(shí)驗(yàn)用代理服務(wù)器界面與源程序清單,內(nèi)含簡(jiǎn)要功能說(shuō)明:

unit main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, ScktComp, TrayIcon, Menus, StdCtrls;

type
   session_record=record
      Used: boolean;                       {會(huì)話記錄是否可用}
      SS_Handle: integer;                  {代理服務(wù)器套接字句柄}
      CSocket: TClientSocket;              {用于連接遠(yuǎn)程的套接字}
      Lookingup: boolean;                  {是否正在查找服務(wù)器}
      LookupTime: integer;                 {查找服務(wù)器時(shí)間}
      Request: boolean;                    {是否有請(qǐng)求}
      request_str: string;                 {請(qǐng)求數(shù)據(jù)塊}
      client_connected: boolean;           {客戶機(jī)聯(lián)機(jī)標(biāo)志}
      remote_connected: boolean;           {遠(yuǎn)程服務(wù)器連接標(biāo)志}
end;

type
  TForm1 = class(TForm)
    ServerSocket1: TServerSocket;
    ClientSocket1: TClientSocket;
    Timer2: TTimer;
    TrayIcon1: TTrayIcon;
    PopupMenu1: TPopupMenu;
    N11: TMenuItem;
    N21: TMenuItem;
    N1: TMenuItem;
    N01: TMenuItem;
    Memo1: TMemo;
    Edit1: TEdit;
    Label1: TLabel;
    Timer1: TTimer;
    procedure Timer2Timer(Sender: TObject);
    procedure N11Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure N21Click(Sender: TObject);
    procedure N01Click(Sender: TObject);
    procedure ServerSocket1ClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ServerSocket1ClientDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ServerSocket1ClientError(Sender: TObject;
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
    procedure ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ClientSocket1Connect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ClientSocket1Disconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
      ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    procedure ClientSocket1Write(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
    procedure ServerSocket1Listen(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure AppException(Sender: TObject; E: Exception);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    Service_Enabled: boolean;           {代理服務(wù)是否開啟}
    session: array of session_record;      {會(huì)話數(shù)組}
    sessions: integer;                  {會(huì)話數(shù)}
    LookUpTimeOut: integer;           {連接超時(shí)值}
    InvalidRequests: integer;            {無(wú)效請(qǐng)求數(shù)}
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

file://系統(tǒng)啟動(dòng)定時(shí)器,啟動(dòng)窗顯示完成后,縮小到System Tray…
procedure TForm1.Timer2Timer(Sender: TObject);
begin
   timer2.Enabled:=false;     {關(guān)閉定時(shí)器}
   sessions:=0;               {會(huì)話數(shù)=0}
   application.OnException := AppException;     {為了屏蔽代理服務(wù)器出現(xiàn)的異常}
   invalidRequests:=0;           {0錯(cuò)誤}
   LookUpTimeOut:=60000;      {超時(shí)值=1分鐘}
   timer1.Enabled:=true;         {打開定時(shí)器}
   n11.Enabled:=false;           {開啟服務(wù)菜單項(xiàng)失效}
   n21.Enabled:=true;           {關(guān)閉服務(wù)菜單項(xiàng)有效}
   serversocket1.Port:=988;      {代理服務(wù)器端口=988}
   serversocket1.Active:=true;    {開啟服務(wù)}
   form1.hide;                 {隱藏界面,縮小到System Tray上}
end;

file://開啟服務(wù)菜單項(xiàng)…
procedure TForm1.N11Click(Sender: TObject);
begin
   serversocket1.Active:=true;    {開啟服務(wù)}
end;


file://停止服務(wù)菜單項(xiàng)…
procedure TForm1.N21Click(Sender: TObject);
begin
   serversocket1.Active:=false;      {停止服務(wù)}
   N11.Enabled:=True;
   N21.Enabled:=False;
   Service_Enabled:=false;           {標(biāo)志清零}
end;


file://主窗口建立…
procedure TForm1.FormCreate(Sender: TObject);
begin
   Service_Enabled:=false;
   timer2.Enabled:=true;        {窗口建立時(shí),打開定時(shí)器}
end;

file://窗口關(guān)閉時(shí)…
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   timer1.Enabled:=false;          {關(guān)閉定時(shí)器}
   if Service_Enabled then
      serversocket1.Active:=false;   {退出程序時(shí)關(guān)閉服務(wù)}
end;

file://退出程序按鈕…
procedure TForm1.N01Click(Sender: TObject);
begin
   form1.Close;                     {退出程序}
end;

file://開啟代理服務(wù)后…
procedure TForm1.ServerSocket1Listen(Sender: TObject;
  Socket: TCustomWinSocket);
begin
   Service_Enabled:=true;            {置正在服務(wù)標(biāo)志}
   N11.Enabled:=false;
   N21.Enabled:=true;
end;

file://被代理端連接到代理服務(wù)器后,建立一個(gè)會(huì)話,并與套接字綁定…
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
var
i,j: integer;
begin
   j:=-1;
   for i:=1 to sessions do               {查找是否有空白項(xiàng)}
      if not session[i-1].Used and not session[i-1].CSocket.active then
         begin
            j:=i-1;                      {有,分配它}
            session[j].Used:=true;       {置為在用}
            break;
         end
      else
         if not session[i-1].Used and session[i-1].CSocket.active then
               session[i-1].CSocket.active:=false;
   if j=-1 then
      begin                              {無(wú),新增一個(gè)}
         j:=sessions;
         inc(sessions);
         setlength(session,sessions);
         session[j].Used:=true;                        {置為在用}
         session[j].CSocket:=TClientSocket.Create(nil);
         session[j].CSocket.OnConnect:=ClientSocket1Connect;
         session[j].CSocket.OnDisconnect:=ClientSocket1Disconnect;
         session[j].CSocket.OnError:=ClientSocket1Error;
         session[j].CSocket.OnRead:=ClientSocket1Read;
         session[j].CSocket.OnWrite:=ClientSocket1Write;
         session[j].Lookingup:=false;
      end;
   session[j].SS_Handle:=socket.socketHandle;    {保存句柄,實(shí)現(xiàn)綁定}
   session[j].Request:=false;                    {無(wú)請(qǐng)求}
   session[j].client_connected:=true;            {客戶機(jī)已連接}
   session[j].remote_connected:=false;           {遠(yuǎn)程未連接}
   edit1.text:=inttostr(sessions);
end;

file://被代理端斷開時(shí)…
procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
var
i,j,k: integer;
begin
   for i:=1 to sessions do
      if (session[i-1].SS_Handle=socket.SocketHandle) and session[i-1].Used then
         begin
            session[i-1].client_connected:=false;   {客戶機(jī)未連接}
            if session[i-1].remote_connected then
               session[i-1].CSocket.active:=false   {假如遠(yuǎn)程尚連接,斷開它}
            else
               session[i-1].Used:=false;           {假如兩者都斷開,則置釋放資源標(biāo)志}
            break;
         end;
   j:=sessions;
   k:=0;
   for i:=1 to j do                        {統(tǒng)計(jì)會(huì)話數(shù)組尾部有幾個(gè)未用項(xiàng)}
      begin
         if session[j-i].Used then
            break;
         inc(k);
      end;
   if k>0 then                          {修正會(huì)話數(shù)組,釋放尾部未用項(xiàng)}
      begin
         sessions:=sessions-k;
         setlength(session,sessions);
      end;
   edit1.text:=inttostr(sessions);
end;

file://通信錯(cuò)誤出現(xiàn)時(shí)…
procedure TForm1.ServerSocket1ClientError(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
var
i,j,k: integer;
begin
   for i:=1 to sessions do
      if (session[i-1].SS_Handle=socket.SocketHandle) and session[i-1].Used then
         begin
            session[i-1].client_connected:=false;   {客戶機(jī)未連接}
            if session[i-1].remote_connected then
               session[i-1].CSocket.active:=false   {假如遠(yuǎn)程尚連接,斷開它}
            else
               session[i-1].Used:=false;           {假如兩者都斷開,則置釋放資源標(biāo)志}
            break;
         end;
   j:=sessions;
   k:=0;
   for i:=1 to j do
      begin
         if session[j-i].Used then
            break;
         inc(k);
      end;
   if k>0 then
      begin
         sessions:=sessions-k;
         setlength(session,sessions);
      end;
   edit1.text:=inttostr(sessions);
   errorcode:=0;
end;

file://被代理端發(fā)送來(lái)頁(yè)面請(qǐng)求時(shí)…
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
tmp,line,host: string;
i,j,port: integer;
begin
   for i:=1 to sessions do                 {判斷是哪一個(gè)會(huì)話}
      if session[i-1].Used and (session[i-1].SS_Handle=socket.sockethandle) then
          begin
             session[i-1].request_str:=socket.ReceiveText;  {保存請(qǐng)求數(shù)據(jù)}
             tmp:=session[i-1].request_str;                 {存放到臨時(shí)變量}
             memo1.lines.add(tmp);
             j:=pos(char(13)+char(10),tmp);                 {一行標(biāo)志}
             while j>0 do                       {逐行掃描請(qǐng)求文本,查找主機(jī)地址}
                begin
                   line:=copy(tmp,1,j-1);                  {取一行}
                   delete(tmp,1,j+1);                      {刪除一行}
                   j:=pos('Host',line);                    {主機(jī)地址標(biāo)志}
                   if j>0 then
                      begin
                         delete(line,1,j+5);               {刪除前面的無(wú)效字符}
                         j:=pos(':',line);
                         if j>0 then
                            begin
                               host:=copy(line,1,j-1);
                               delete(line,1,j);
                               try
                                  port:=strtoint(line);
                               except
                                  port:=80;
                               end;
                            end
                         else
                            begin
                               host:=trim(line);                 {獲取主機(jī)地址}
                               port:=80;
                            end;
                         if not session[i-1].remote_connected then  {假如遠(yuǎn)征尚未連接}
                            begin
                               session[i-1].Request:=true;      {置請(qǐng)求數(shù)據(jù)就緒標(biāo)志}
                               session[i-1].CSocket.host:=host;  {設(shè)置遠(yuǎn)程主機(jī)地址}
                               session[i-1].CSocket.port:=port;     {設(shè)置端口}
                               session[i-1].CSocket.active:=true;   {連接遠(yuǎn)程主機(jī)}
                               session[i-1].Lookingup:=true;        {置標(biāo)志}
                               session[i-1].LookupTime:=0;          {從0開始計(jì)時(shí)}
                            end
                         else
                            {假如遠(yuǎn)程已連接,直接發(fā)送請(qǐng)求}
                            session[i-1].CSocket.socket.sendtext(session[i-1].request_str);                                   
                         break;                        {停止掃描請(qǐng)求文本}
                      end;
                   j:=pos(char(13)+char(10),tmp);           {指向下一行}
                end;
             break;                    {停止循環(huán)}
          end;
end;

file://當(dāng)連接遠(yuǎn)程主機(jī)成功時(shí)…
procedure TForm1.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
var
i: integer;
begin
   for i:=1 to sessions do
      if (session[i-1].CSocket.socket.sockethandle=socket.SocketHandle) and session[i-1].Used then
         begin
            session[i-1].CSocket.tag:=socket.SocketHandle;
            session[i-1].remote_connected:=true;   {置遠(yuǎn)程主機(jī)已連通標(biāo)志}
            session[i-1].Lookingup:=false;         {清標(biāo)志}
            break;
         end;
end;


file://當(dāng)遠(yuǎn)程主機(jī)斷開時(shí)…
procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
  Socket: TCustomWinSocket);
var
i,j,k: integer;
begin
   for i:=1 to sessions do
      if (session[i-1].CSocket.tag=socket.SocketHandle) and session[i-1].Used then
         begin
            session[i-1].remote_connected:=false;       {置為未連接}
            if not session[i-1].client_connected then
               session[i-1].Used:=false       {假如客戶機(jī)已斷開,則置釋放資源標(biāo)志}
            else
               for k:=1 to serversocket1.Socket.ActiveConnections do
                  if (serversocket1.Socket.Connections[k-1].SocketHandle=session[i-1].SS_Handle) and session[i-1].used then
                     begin
                        serversocket1.Socket.Connections[k-1].Close;
                        break;
                     end;
            break;
         end;
   j:=sessions;
   k:=0;
   for i:=1 to j do
      begin
         if session[j-i].Used then
            break;
         inc(k);
      end;
   if k>0 then                        {修正會(huì)話數(shù)組}
      begin
         sessions:=sessions-k;
         setlength(session,sessions);
      end;
   edit1.text:=inttostr(sessions);
end;

file://當(dāng)與遠(yuǎn)程主機(jī)通信發(fā)生錯(cuò)誤時(shí)…
procedure TForm1.ClientSocket1Error(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
var
i,j,k: integer;
begin
   for i:=1 to sessions do
      if (session[i-1].CSocket.tag=socket.SocketHandle) and session[i-1].Used then
         begin
            socket.close;
            session[i-1].remote_connected:=false;       {置為未連接}
            if not session[i-1].client_connected then
               session[i-1].Used:=false        {假如客戶機(jī)已斷開,則置釋放資源標(biāo)志}
            else
               for k:=1 to serversocket1.Socket.ActiveConnections do
                  if (serversocket1.Socket.Connections[k-1].SocketHandle=session[i-1].SS_Handle) and session[i-1].used then
                     begin
                        serversocket1.Socket.Connections[k-1].Close;
                        break;
                     end;
            break;
         end;
   j:=sessions;
   k:=0;
   for i:=1 to j do
      begin
         if session[j-i].Used then
            break;
         inc(k);
      end;
   errorcode:=0;
   if k>0 then                        {修正會(huì)話數(shù)組}
      begin
         sessions:=sessions-k;
         setlength(session,sessions);
      end;
   edit1.text:=inttostr(sessions);
end;

file://向遠(yuǎn)程主機(jī)發(fā)送頁(yè)面請(qǐng)求…
procedure TForm1.ClientSocket1Write(Sender: TObject;
  Socket: TCustomWinSocket);
var
i: integer;
begin
   for i:=1 to sessions do
      if (session[i-1].CSocket.tag=socket.SocketHandle) and session[i-1].Used then
         begin
            if session[i-1].Request then
               begin
                  socket.SendText(session[i-1].request_str);   {假如有請(qǐng)求,發(fā)送}
                  session[i-1].Request:=false;                 {清標(biāo)志}
               end;
            break;
         end;
end;

file://遠(yuǎn)程主機(jī)發(fā)來(lái)頁(yè)面數(shù)據(jù)時(shí)…
procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var
i,j: integer;
rec_bytes: integer;                  {傳回的數(shù)據(jù)塊長(zhǎng)度}
rec_Buffer: array[0..2047] of char;  {傳回的數(shù)據(jù)塊緩沖區(qū)}
begin
   for i:=1 to sessions do
      if (session[i-1].CSocket.tag=socket.SocketHandle) and session[i-1].Used then
         begin
            rec_bytes:=socket.ReceiveBuf(rec_buffer,2048);    {接收數(shù)據(jù)}
            for j:=1 to serversocket1.Socket.ActiveConnections do
               if serversocket1.Socket.Connections[j-1].SocketHandle=session[i-1].SS_Handle then
                  begin
                     serversocket1.Socket.Connections[j-1].SendBuf(rec_buffer,rec_bytes);  {發(fā)送數(shù)據(jù)}
                     break;
                  end;
            break;
         end;
end;

file://“頁(yè)面找不到”等錯(cuò)誤信息出現(xiàn)時(shí)…
procedure TForm1.AppException(Sender: TObject; E: Exception);
begin
  inc(invalidrequests);
end;

file://查找遠(yuǎn)程主機(jī)定時(shí)…
procedure TForm1.Timer1Timer(Sender: TObject);
var
i,j: integer;
begin
   for i:=1 to sessions do
      if session[i-1].Used and session[i-1].Lookingup then    {假如正在連接}
         begin
            inc(session[i-1].LookupTime);
            if session[i-1].LookupTime>lookuptimeout then     {假如超時(shí)}
               begin
                  session[i-1].Lookingup:=false;
                  session[i-1].CSocket.active:=false;         {停止查找}
                  for j:=1 to serversocket1.Socket.ActiveConnections do
                     if serversocket1.Socket.Connections[j-1].SocketHandle=session[i-1].SS_Handle then
                        begin
                           serversocket1.Socket.Connections[j-1].Close;  {斷開客戶機(jī)}
                           break;
                        end;
               end;
         end;
end;
end.

3、 后記
由于這種設(shè)計(jì)思路僅僅在被代理端和遠(yuǎn)程主機(jī)之間增加了一個(gè)重定向功能,被代理端原
有的緩存技術(shù)等特點(diǎn)均保留,因此效率較高。經(jīng)過(guò)測(cè)試,利用1個(gè)33.6K的Modem上網(wǎng)時(shí),三到十個(gè)被代理工作站同時(shí)上網(wǎng),仍有較好的響應(yīng)速度。由于被代理工作站和代理服務(wù)器工作站之間的連接一般通過(guò)高速鏈路,因此瓶頸主要出現(xiàn)在代理服務(wù)器的上網(wǎng)方式上。
通過(guò)上述方法,作者成功開發(fā)了一套完善的代理服務(wù)器軟件并與機(jī)房計(jì)費(fèi)系統(tǒng)完全集
成,實(shí)現(xiàn)了利用一臺(tái)工作站完成上網(wǎng)代理、上網(wǎng)計(jì)費(fèi)、用機(jī)計(jì)費(fèi)等功能。 有編程經(jīng)驗(yàn)的朋友完全可以另行增加代理服務(wù)器功能,如設(shè)定禁止訪問(wèn)站點(diǎn)、統(tǒng)計(jì)客戶流量、Web訪問(wèn)列表等等。

 



上一篇:VC與Delphi之間動(dòng)態(tài)鏈接庫(kù)互相調(diào)用

下一篇:Delphi精品書籍推薦

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
學(xué)習(xí)交流
熱門圖片

新聞熱點(diǎn)

疑難解答

圖片精選

網(wǎng)友關(guān)注

av影视在线看| 日韩久久不卡| 日韩三级视频在线| 欧美日本精品| 亚洲经典中文字幕| 欧美激情一区二区三区在线| 91精品国产综合久久香蕉最新版| 99精品999| 日韩欧美亚洲国产一区| 亚洲一区在线观看免费| 在线观看国产福利视频| 不卡专区在线| 欧美乱大交xxxxx免费| 黄色一级大片在线免费看国产一| 亚洲国产福利视频| 欧美日韩在线精品成人综合网| 国产乱国产乱300精品| 国产h片在线观看| 日韩精品高清不卡| va中文字幕| 91精品国产高清久久久久久| 国产日韩精品久久久| 久久精品国产99| 91精品国产综合久久精品| 欧美日韩一二三| 欧美特黄一区| 1024国产在线| 一区二区视频在线| 欧美日韩中文字幕日韩欧美| 日韩亚洲不卡在线| 香蕉视频亚洲一级| 欧美日韩中文字幕视频| 黄色视屏免费在线观看| 国产三级精品网站| 国产999在线观看| 亚洲 国产 欧美 日韩| 中文字幕最新精品| 精品在线一区二区| 国产黄在线观看免费观看不卡| 日韩午夜一区| 中文国产字幕在线观看| 一区二区不卡在线| 日韩中文字幕国产| 欧美日韩国产一级片| 日韩视频在线免费播放| 日韩精品视频网| 精品免费久久久| 国产成人精品免费久久久久| 国产日韩第一页v| 日韩一级二级三级精品视频| 婷婷精品进入| 日韩欧美亚洲视频| 日韩欧美中文字幕在线观看| 欧美三级在线看| 亚洲 欧美综合在线网络| 欧美一级在线免费| 日韩你懂的电影在线观看| 精品视频资源站| 亚洲欧洲国产视频| 国产手机视频一区二区| 中文字幕中文字幕精品| 久草视频在线看| 欧美日韩在线播放一区| 日本精品在线播放| 日韩亚洲欧美中文在线| 91精品在线观| 黄色精品在线观看| 欧美日韩国产高清视频| 色偷偷一区二区三区| 精品三级久久| 日韩 欧美 亚洲| 欧美日韩国产免费| av中文网站| 天天在线视频色| 日韩视频一区在线观看| 精品全国在线一区二区| 精品国产91乱高清在线观看| 国产在线精品国自产拍免费| 亚洲女人天堂a在线播放| 亚洲理论中文字幕| 国产在线不卡一区| 亚洲精华国产欧美| 欧美日韩中文| 亚洲一区在线观看视频| 久99久视频| 美女免费视频一区| 久久人人精品| 97国产视频| 色综合婷婷久久| 中文欧美日韩| 日韩视频在线一区二区三区| 欧美日韩国产大片| 日韩精品欧美在线| 欧美日韩亚洲天堂| 中文字幕在线视频久| 亚洲一区在线观看视频| 日韩不卡高清视频| 欧美日韩精品久久久| 亚洲欧洲在线观看av| 欧美日韩高清一区二区| 欧美日韩高清在线播放| 日韩中文字幕视频在线观看| 91精品网站| 不卡视频一区二区| 亚洲一区中文| 成人一区二区不卡免费| 午夜精品一区二区三区免费视频| 人成免费在线视频| 黄色国产网站在线播放| 国产精品一区二区三区免费观看| 中文官网资源新版中文第二页在线观看 | 国产不卡精品在线| 中文字幕欧美日韩在线| 国产在线拍揄自揄拍| 精品一区二区在线观看视频| a天堂中文在线官网在线| 久久久久久99精品| 中文字幕 欧美 日韩| 亚洲视频日韩| 亚洲第一视频在线观看| 欧美日韩国产一区在线| 69堂精品视频在线播放| xxxcom在线观看| 欧美三级一区二区三区| 日韩精品在线免费观看视频| 中文不卡在线| 91精品在线国产| 日韩在线 中文字幕| 国产中文在线| 精品区一区二区| 久久精品国产视频| 国产91久久久久蜜臀青青天草二| 精品亚洲永久免费| 色99中文字幕| 欧美午夜精品在线| 国产123在线| 精品国产乱码久久久久久牛牛| 亚洲免费观看视频| 黄色国产在线| 欧美日韩视频免费看| 精品日韩视频| 欧美日韩中文字幕在线| 99国产一区| 日韩中文字幕视频在线观看| √新版天堂资源在线资源| 亚洲欧美日本国产专区一区| 精品在线91| 国产在线导航| 国产免费久久| 日韩三区免费| 国产精品视频福利一区二区| 亚洲第一视频网站| 日韩精品视频在线观看网址| aaa大片在线观看| 久久婷婷亚洲| 区日韩二区欧美三区| 国产日韩中文字幕在线| 国产香蕉免费精品视频| 国产欧美久久久| 国产欧美日韩高清| 亚洲.国产.中文慕字在线| 亚洲综合在线视频| 欧美日韩中文另类| 久久精品在线观看| 日韩精品视频网站| 91日韩中文字幕| 久久精品久久久久| 欧美xxxx中国| 亚洲社区在线| 欧美亚洲综合视频| 91精品电影| 亚洲一级二级| 欧美成人精品在线| 国产高清在线视频| 国产免费电影网站入口| 欧美日韩成人综合| 日韩欧美在线综合网| 日韩中文欧美在线| 亚洲黄色在线观看| 蜜臀久久精品| 国产欧美在线观看| 91久久视频| 成年人黄国产| 在线观看国产福利视频| 亚洲最新永久观看在线| 日韩精品在线免费播放| 一级特黄aaa大片在线观看| 精品一二三四区| 精品成人久久久| 国产乱码在线| 中文字幕 欧美日韩| 欧美日韩亚洲一| 亚洲高清在线免费| 一区二区三区鲁丝不卡| 国产欧美日韩亚州综合| 欧美日韩亚洲系列| 国产视频1区| 精品999在线| 国产乱码午夜在线视频| 日韩高清不卡| 亚洲va久久久噜噜噜久久| 日韩欧美中文字幕在线播放| 精品视频资源站| 中文字幕在线视频第一页| 综合激情一区| 国自产拍在线网站网址视频| 国产 欧美 日韩 在线| 国产成人精品免费久久久久| 日韩在线视频网| 国产视频aaa| 欧美日韩成人一区| 91精品国产日韩91久久久久久| 91精品国产91综合久久蜜臀| 亚洲校园欧美国产另类 | 亚洲美女视频一区| 亚洲大片精品永久免费| 日本精品在线播放| 日韩欧美在线中文字幕| 韩国av一区二区| 国产一级在线免费观看| 日韩欧美99| 先锋男人资源站| 欧美变态tickling挠脚心| 日韩色在线观看| 日韩中文字幕亚洲| 国产亚洲欧美色| 国产欧美日韩在线| 国产性一级片| 一区二区三区在线|网站| 国产成人精品免费网站| 91精品国产综合久久久久| 中文字幕亚洲在| 视频一区二区国产| 丰满少妇一区| 日韩高清不卡一区二区| 中文字幕在线视频第一页| 色屁屁一区二区| 亚洲三级网站| 欧美 日韩 国产在线观看| 中文字幕在线看视频国产欧美| 国产欧美日韩精品高清二区综合区| 一区二区三区在线播放欧美| 亚洲一区二区三区精品中文字幕| 日韩一级视频在线观看| 中文字幕日韩视频| 欧美高清视频一区二区三区| 日韩av一区二区在线观看| 黄色在线播放网站| 欧美日韩在线播放一区| 欧美日韩中文国产| 欧美日韩综合视频| 国产劲爆久久| 欧美不卡123| 在线中文字幕视频观看| 91精品在线国产| 中文字幕亚洲一区二区av在线| 黄色一区二区在线| 欧美日韩中文字幕在线观看| 精品中文字幕视频| 中文字幕精品一区二区三区在线| 精品亚洲国内自在自线福利| 中文字幕在线视频精品| 国产羞羞视频在线播放| 久久久久久91| 日韩在线不卡一区| 中文字幕欧美日韩精品| 精品国产91乱高清在线观看| 91亚洲国产| 欧美乱大交xxxxx免费| 欧美日韩精品欧美日韩精品| 欧美日韩激情在线一区二区三区| 欧美日韩综合视频网址| 久艹在线视频| 亚洲成av人片| www在线视频| 日韩va亚洲va欧洲va国产| 在线欧美日韩精品| 激情国产在线| 日韩精品综合在线| 亚洲高清中文字幕| 在线国产99| 亚洲免费专区| 欧美日韩亚洲国内综合网俺| 天堂在线中文| 一区三区二区视频| 一区二区三区在线|网站| 国产丝袜在线播放| 国产欧美在线观看| 欧美在线中文字幕| 国产成免费视频| 亚洲第一香蕉网| 美女在线视频一区| 欧美在线视频第一页| 欧美日韩三级视频| 日韩欧美三级在线| 欧美久久一二三四区| 一区二区三区精品久久久| 日本不卡视频一区| 成人xxxx| 日韩国产一区久久| 午夜成人鲁丝片午夜精品| 中文字幕在线播出| 中文字幕亚洲一区二区av在线| 日韩精品福利视频| 国产专区中文字幕| 日韩午夜中文字幕| 天堂精品高清1区2区3区| 日韩精品资源二区在线| 欧美日韩国产中文精品字幕自在自线| 亚洲免费中文字幕| 中文字幕在线欧美| 日韩a一区二区| 日本亚洲欧美天堂免费| 日韩中文在线视频| 成片免费观看| 日韩午夜高潮| 日韩精品在线中文字幕| 日韩av一区在线| 顶级网黄在线播放| 欧美国产亚洲一区| 亚洲人成欧美中文字幕| 一区二区三区四区五区视频在线观看| 精品一区二区在线观看视频| 国产婷婷色一区二区三区在线| av一区在线观看| av不卡免费看| 国产乱国产乱300精品| 亚洲免费中文字幕| 欧美亚洲国产免费| 日韩在线视频一区| 青青久在线视频免费观看| 91精品国产91| 欧美日韩国产观看视频| 日韩视频精品在线| 日韩欧美不卡| 亚洲一二三不卡| 人成免费在线视频| 国产在线黄色片| 欧洲精品在线视频| 日韩欧美亚洲视频| 午夜国产视频| 亚洲娇小xxxx欧美娇小| 国产手机视频一区二区| 中文字幕精品一区二| 中文字幕精品视频| 亚洲大胆人体av| 一本大道一区二区三区| 成人a在线观看| 精品久久九九| 国内精品99| 日韩欧美国产1| 一区二区在线高清视频| 欧美日韩色综合| 日韩一级网站| 亚洲一区中文字幕在线| 日本亚洲欧美三级| 国产卡1卡2卡三卡在线| 欧美三级在线看| 91精品国产综合久久精品| av一卡二卡| 国产免费不卡av| 91精品蜜臀在线一区尤物| 91精品在线视频观看| 日韩欧美亚洲国产| 久久 天天综合| 亚洲黄色片在线观看| 免费国产h视频在线观看86| 日韩精品在线免费观看视频| 日韩a一区二区| 欧美日韩国产一二三| 欧美日韩尤物久久| 欧美日韩精品免费看| 国产黄色高清在线| 久久综合久久综合九色| 国产黄色精品| 欧美三级在线播放| 日韩午夜中文字幕| 中文字幕亚洲字幕| 欧美日韩一二三四| 中文字幕在线视频网| 婷婷久久综合九色国产成人| 精品视频国产| 高清日韩中文字幕| 国产在线www| 蜜臀久久精品| 日韩中文字幕| 国产欧美综合在线| 国产第一页在线播放| 国产香蕉精品视频| 欧美大片在线观看一区| 日韩av一区二区在线| 欧美久久综合性欧美| 一本大道一区二区三区| a视频免费看| 中文在线视频观看| 日韩精品丝袜在线| 日韩精品在线视频| 欧美日韩亚洲天堂| 日韩精品在线第一页| 欧美大片在线观看一区|