首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

求支持HTTP代理用户访问的程序写法,感谢!解决思路

2012-04-03 
求支持HTTP代理用户访问的程序写法,感谢!有如下一个程序,分为客户端和服务器端,客户端使用的是client1:TId

求支持HTTP代理用户访问的程序写法,感谢!
有如下一个程序,分为客户端和服务器端,客户端使用的是   client1:   TIdTCPClient控件  
客户端与服务器端交互的是如下一个结构体来传递信息,
RCommDataBlock:是定义的一个结构体:
PRCommDataBlock   =   ^RCommDataBlock;        
    RCommDataBlock   =   Record                              
        Cmdtype       :   Integer;                                    
        cBuffer       :   Array[0..1024]   of   char;
        dwBufSize   :   DWord;                                    
        cPar1:   Array[0..19]   of   char;    
    end;
---------
客户端所有访问服务器的命令都是通过 RequestSv 函数来与服务器交换,获取返回值.
client1.host:=trim(ipstr);                           --服务器IP
client1.Port:=StrToInt(trim(portstr));   --我们指定的端口号
EType=Array[0..1024]   of   char;

function   RequestSv(var   cmdtype:integer;var   buffer1:EType;   var   p1:string;var   rsize:DWord):RCommDataBlock;
var
  msg:RCommDataBlock;
begin
  fillchar(msg,sizeof(msg),0);                                          
  msg.Cmdtype   :=   cmdtype;
  EType(msg.cBuffer):=buffer1;
  LStrCpy(msg.cPar1,PChar(trim(p1)));
  msg.dwBufSize:=rsize;
                             
    client1.WriteBuffer(msg,sizeof(msg));   //提交
    fillchar(msg,sizeof(msg),0);
    client1.ReadBuffer(msg,sizeof(msg));     //反馈

  result:=msg;
         
end;
-----------
客户端通过这一函数向服务器发出信息并获取返回信息RCommDataBlock,在客户端程序里解析。

现在的问题是如果客户是通过HTTP代理服务器上网的,就无法通过我们指定的端口号来直接访问我们的服务器,
要把如上程序改成支持客户输入代理服务器的IP和端口验证名和密码,支持通过代理来访问我们服务器。这程序该怎么改呢?求详细点的程序,最好在以上程序上修改。

[解决办法]
俺之所以这样用的 原因:
1。以前的程序可以轻松的使用互联网的数据库
只需根据设置决定是否执行
ADOConn.Httphost := 'http://220.203.0.??/svr/sql.dll/sql ';
2。WebConnection速度慢,SocketConnection大数据量下也不好。
3。这样改的程序可以可以通过设置在局域网中依然用原来的
模式(速度快)。例如
if DebugHook=0 then
ADOConn.Httphost := 'http://220.203.0.??/logserver/sql.dll/sql '
else
....................
这样可以在delphi 调试时连本地库(速度快 呵呵)。
一句话,就是灵活了。


缺点:
事务 与WebConnection 一样,自己处理。

其实 这种方法是邪派的,不过我经常遇到一些问题,时间紧,就只好用邪派的招数了。
以前要一天内将一个access的程序(我记得好像是121个窗体)改到sql server上,同时
access的版本也要一直继续下去,因为客户的环境不一样。当时我也是改了ADODB.pas,
主要是加了一个sql转换的环节,即将access的某些函数转为sql server 的,如:
trim() > ltrim(rtrim()) instr > charindex 等 另外配合一些sql server 自定义
的函数 。
正统的做法,改成b/s的吧。因为如果使用web的数据,整体的设计思路不一样,例如,如
果要用WebConnection 你要注意连接的次数,事物处理,脱机时的处理。注意这是正统,
不是正确,正确的方法要视情况定,时间,人手,性能要求,后续发展。。。。。。。。。。。


[解决办法]
客戶公司使用了HTTP proxy,


一般來說, 就限制了客戶公司內部電腦只能訪問外網Web端口,一般允許80,8080通過.
1. 首先,需要欺騙HTTP PROXY,認為你的Server為 WEB端口.需要修改你的服務端程序在80端口監聽.或使用hts轉發.
2. 這時,如果你的Server是WEB,客戶瀏覽器通過Proxy就可以訪問了. 但你現在不是.
如果PROXY支持CONNECT方法,這時你的Client程序發出CONNET dataserver,Proxy會忠實轉發Client以及Server間的數據包.
否則你可以用htc將數據包還原.

3 .如需訪問SQL Server(1433).
htc ----------------> http proxy -----------> hts ---------> db serve
(localhost:1433) (proxyhost:80) (sql_srv:80) (sql_srv:1080)

討論技術可以這麼做,和客戶協商裝個socks5 Sever是個好方法.

热点排行