大虾们能来谈谈代理服务器的实现原理吗?谁有没有相关的资料或者原代码,提供点这方面的信息给我啊!最近公司老大要我弄这个,我还一头雾水呢·帮帮忙啊

解决方案 »

  1.   

    2000年电脑报29,30,31期编程学堂有用Delphi设计代理服务器的文章,还有源码
    里面使用了rxlib2.75中的控件)
    如果您在该代码中受到了启发,请与大家共享。
    unit main;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ExtCtrls, Menus, ScktComp, RXShell, RxMenus, AppEvent, Mask,
      ToolEdit, CurrEdit;type
      MySe_record=record
        Used:boolean;
        SS_handle:integer;
        Csocket:tclientsocket;
        lookingup:boolean;
        lookuptime:integer;
        request:boolean;
        request_str:string;
        client_connected:boolean;
        remote_connected:boolean;
      end;
    type
      TForm1 = class(TForm)
        ClientSocket1: TClientSocket;
        ServerSocket1: TServerSocket;
        Panel1: TPanel;
        Memo1: TMemo;
        Label1: TLabel;
        PopupMenu1: TRxPopupMenu;
        N11: TMenuItem;
        N21: TMenuItem;
        N01: TMenuItem;
        mhssoft: TMenuItem;
        AppEvents: TAppEvents;
        TrayIcon1: TRxTrayIcon;
        N1: TMenuItem;
        N2: TMenuItem;
        Edit1: TCurrencyEdit;
        Label2: TLabel;
        Edit2: TEdit;
        Label3: TLabel;
        Edit3: TCurrencyEdit;
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure ServerSocket1ClientRead(Sender: TObject;
          Socket: TCustomWinSocket);
        procedure ClientSocket1Write(Sender: TObject;
          Socket: TCustomWinSocket);
        procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
      private
        { Private declarations }
      public
        service_enabled:boolean;
        MySe:array of MySe_record;
        MySes:integer;
        lookuptimeout:integer;
        invalidrequests:integer;
        { Public declarations }
      end;var
      Form1: TForm1;
    var
      tmp:string;implementation{$R *.DFM}
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      caption:=application.Title;
    //  edit2.Text:=MacData20001.Local_IP;
      edit2.ReadOnly:=true;
      memo1.Align:=alclient;
      serversocket1.port:=round(edit3.value);
      serversocket1.Active:=true;
      application.Minimize;
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      if service_enabled then
        serversocket1.Active:=false;
    end;procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      line,host:string;
      i,j,port:integer;
    begin
      tmp:=socket.ReceiveText;
      memo1.ReadOnly:=false;
      memo1.Lines.Add(tmp);
      memo1.ReadOnly:=true;
      j:=pos(chr(13)+chr(10),tmp);
      while j>0 do begin
        line:=copy(tmp,1,j-1);
        delete(tmp,1,j+1);
        j:=pos('Host',line);
        if j>0 then begin
          delete(line,1,j+5);
          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);
            port:=80;
          end;
          if not clientsocket1.active then begin
            clientsocket1.host:=host;
            clientsocket1.port:=port;
            clientsocket1.active:=true;
          end else clientsocket1.socket.sendtext(tmp);
          break;
        end;
        j:=pos(#13+#10,tmp);
      end;
    end;procedure TForm1.ClientSocket1Write(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
      socket.SendText(tmp);
    end;procedure TForm1.ClientSocket1Read(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      i,j:integer;
      rec_bytes:integer;
      rec_buffer:array[0..2047] of char;
    begin
      rec_bytes:=socket.ReceiveBuf(rec_buffer,2048);
      serversocket1.Socket.Connections[j-1].SendBuf(rec_buffer,rec_bytes);
    end;
    end.