高手们都到那里去了,300分!在线等待 ( 积分: 200 )

  • 主题发起人 主题发起人 foreach
  • 开始时间 开始时间
F

foreach

Unregistered / Unconfirmed
GUEST, unregistred user!
描述:
客户端 服务器上 外部程序(不在局域网内)
IDTCPCLIENT--> (IDTCPSERVER-->IDTCPCLIENT)------>TCPSERVER

过程:发送请求--->IDTCPSERVER接受--传递给IDTCPCLIENT---->发送给外部TCPSERVER

外部程序是要通过认证的(密码验证),客户端程序通过TCP方式,连接其它公司的服务器程序,对方采取IP地址认证的方式来对客户端进行认证。

问题:
我想开发一个类似代理服务器的程序,模拟对方的客户端程序连接上对方服务器(该部分已经实现)。该代理服务器程序使用了Indy的IdTCPClient控件,连接后同时使用IdTCPServer控件在一个固定的端口监听,接受客户端程序的请求。收到客户端程序的请求后,进行排队处理,将请求通过IdTCPClient发送给对方服务器,收到结果后再通过IdTCPServer控件返回给客户端。其实类似一个放大器程序,将以前的一个IP地址上的应用可扩展到多台电脑上使用。
到底怎么处理呀!在线等待!!!!!!!!!!!!!!!!
 
描述:
客户端 服务器上 外部程序(不在局域网内)
IDTCPCLIENT--> (IDTCPSERVER-->IDTCPCLIENT)------>TCPSERVER

过程:发送请求--->IDTCPSERVER接受--传递给IDTCPCLIENT---->发送给外部TCPSERVER

外部程序是要通过认证的(密码验证),客户端程序通过TCP方式,连接其它公司的服务器程序,对方采取IP地址认证的方式来对客户端进行认证。

问题:
我想开发一个类似代理服务器的程序,模拟对方的客户端程序连接上对方服务器(该部分已经实现)。该代理服务器程序使用了Indy的IdTCPClient控件,连接后同时使用IdTCPServer控件在一个固定的端口监听,接受客户端程序的请求。收到客户端程序的请求后,进行排队处理,将请求通过IdTCPClient发送给对方服务器,收到结果后再通过IdTCPServer控件返回给客户端。其实类似一个放大器程序,将以前的一个IP地址上的应用可扩展到多台电脑上使用。
到底怎么处理呀!在线等待!!!!!!!!!!!!!!!!
 
IDTCPCLIENT--> (IDTCPSERVER-->IDTCPSERVER)------>TCPSERVER
发送请求 接受--传递给IDTCPSERVER 发送给外部TCPSERVER
应该为:
IDTCPCLIENT--> (IDTCPSERVER-->IDTCPCLIENT)------>TCPSERVER
发送请求 接受--传递给IDTCPCLIENT 发送给外部TCPSERVER
 
好像是用个IP数据包的封装后,再转出去的吧
 
[red]问题:
1、怎么在收到客户端程序的请求后,将请求通过IdTCPClient发送给对方服务器,
2、客户端程序的请求如何动态使用这几个连接进行发送?如何判断哪个连接正空闲,对请求进行排队处理?
[/red]
我查了一下应该和
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2535452
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2853782有相似性
 
使用API做20分钟搞定。前几天刚做了一个!!!
我的是用来代理数据库的,让外网的PC可以连接到网内的数据库上!其中通信有一部分使用USB通信的。
 
没看明白,Sorry
 
不好意思!这个也不懂。
 
看来是想破解软件用户限制,看来好像很简单,可是牵涉到事务,执行时序之类的东东,靠排队怎么来完成。还是好好买客户授权好了。
 
不好意思,Indy控件是多线程的,只要把线程控制好就行了。
我现在忙,还不完全明白你的需求
 
查到的一些类似贴子:

我公司的客户端程序通过TCP方式连接其它公司的服务器程序,对方采取IP地址认证的方式来对客户端进行认证。
我想开发一个类似代理服务器的程序,模拟对方的客户端程序连接上对方服务器(该部分已经实现)。该代理服务器程序使用了Indy的TCPClient控件,连接后同时使用TCPServer控件在一个固定的端口监听,接受客户端程序的请求。收到客户端程序的请求后,进行排队处理,将请求通过TCPClient发送给对方服务器,收到结果后再通过TCPServer控件返回给客户端。其实类似一个放大器程序,将以前的一个IP地址上的应用可扩展到多台电脑上使用。

现在的问题是:
1、对方现在提供了3个IP地址,我可以在一台电脑上绑定这3个IP,并在TCPClient控件的BoundIP属性内设定IP,这样便可通过对方的认证。可是在程序内我是否也要相应使用3个TCPClient控件呢?如果以后增加了IP地址(几十个),岂非也要增加控件?还是动态创建控件?

2、客户端程序的请求如何动态使用这几个连接进行发送?如何判断哪个连接正空闲,对请求进行排队处理?

真的很头疼,也就剩下这点分了,全部拿出来。希望哪位DFW能告知答案,哪怕是个思路都行。

多谢!



来自:cash95, 时间:2004-4-2 11:40:06, ID:2535513
创建线程,3个IP创建3个线程,线程中动态创建TIdTCPClient,每个线程只处理自己的数据。indy的demo有完整代码。


来自:loster2003, 时间:2004-4-2 11:45:26, ID:2535529
是指indy的那个chat的demo吗?我看了,有些不大懂,它的例子是管理客户端的thread的。你的意思是不是说我连接对方的服务器时动态创建TIdTCPClient?然后通过ThreadID来管理?
这方面的编程经验不足,能不能简单写个demo给我看一下?


来自:cash95, 时间:2004-4-2 11:52:46, ID:2535551
constructor TClientHandleThread.Create();
begin
FIdTCPClient:=TIdTCPClient.Create(nil);
FreeOnTerminate := false;
end;
procedure TClientHandleThread.Execute;
begin
用FIdTCPClient处理数据
end;
destructor TClientHandleThread.Destroy;
begin
FIdTCPClient.free;
inherited;
end;
创建1个处理线程
GClientTd:=TClientHandleThread.Create();
GClientTd.Priority := tpHighest;
GClientTd.Resume;//启动线程


来自:itren, 时间:2004-4-2 12:36:58, ID:2535650
你要自己维护请求Client和返回的数据Client或者数据的匹配关系.

-- 外部的 Server -
Client
|
--- YourServer ---- 实际的Client1,2,3,...,
|
在建立连接后,读取请求并转发(通过和自己服务器的和外部的连接)给外部Server 等待返回结果再将结果发回Client
YourServer :
ListenThread : 一个监听的Socket 管理类.
OutThread : 和外部连接的Socket 管理类
Task:Tlist;
InnerClient:Tlist; (add Socket,CLientID )

在连接建立时保存 CLientID 然后转发请求并等待数据返回.如果有数据直接返回给Client




请教以下问题,应该属于很基础的问题,概念性的

我在程序中定义了以下类型
// 连接服务器线程声明
TClientHandleThread = class(TThread)
private
public
FIdTCPClient :TIdTCPClient;
FStatus : String; // 使用状态 Y/N/L
OrderBuffer :TStrings; // 需处理的命令缓冲区
pThread: Pointer; // 指向客户线程
...
constructor Create(CreateSuspended: Boolean;);
procedure Execute; override;
destructor Destroy;
end;

现在的问题是:
1、如何定义类中的 FIdTCPClient 的事件,并在事件中写一些处理方法,如 OnDisconnect时间。
2、不知道每次需要几个这样的类,如何创建这个类的一个列表?我以前用的是个笨办法:var
GClientTd : array[1..50] of TClientHandleThread;
估计最多需要50个,就创建了一个50个类的数组,然后按照数组调用的方法调用。很土的办法,应该用TList可以做到,可是该怎样写?我的基础比较差,哪位帮忙给个写法?
呵呵,先多谢了。



来自:yubufeng, 时间:2004-10-19 9:35:27, ID:2853821
如何定义类中的 FIdTCPClient 的事件,并在事件中写一些处理方法,如 OnDisconnect时间。

TIdTCPClient是啥啊?
我按F1看到
TIdTCPClient = class(TIdTCPConnection)
不要耍我好不好。


来自:loster2003, 时间:2004-10-19 9:40:30, ID:2853839
是Indy的TCPClient控件,我需要用到它来进行数据通信


来自:yubufeng, 时间:2004-10-19 10:46:45, ID:2854069
1、定义一个类方法
procedure DoDisconn(Sender: TObject);

procedure TClientHandleThread.DoDisconn(Sender: TObject);
begin
//你要干的事
end;
在创建完FIdTCPClient后
FIdTCPClient .OnDisconnected := DoDisconn;


来自:yubufeng, 时间:2004-10-19 10:59:00, ID:2854112
2、用TList可以,用动态数组也差不多。
动态数组:
GClientTd : array of TClientHandleThread;
要加一个线程的时候,
var
oldLen: Integer;
//....
oldLen := Length(GClientTd);
SetLength(GClientTd,oldLen + 1);
//GClientTd [Length(oldLen)]为最后加入的

TList:
GClientTdLst: TList;
var
GClientTd: TClientHandleThread;
先创建TList
GClientTdLst:= TList.Create;
要加一个线程的时候,
GClientTd := TClientHandleThread.Create(True);
//...
然后
 GClientTdLst.Add(GClientTd);
var
I: Integer;
I := GClientTdLst.Count - 1;
//TClientHandleThread(GClientTdLst)//为最后加入的
 




 
没有做过,帮不了你
 
抱歉,没有往这方面钻过,帮不了你。
 
同意 gangp。
如果你能确保数据包中不含有身份验证的信息,并且每一个数据包与时序无关,那么
根据你提供的信息可以写一个类似程序,否则就要分析通信协议了。
 
抱歉~~我也没有往这方面砖过~~~
 
没做过这方面,帮不了你。 :(
 
最简单的方法是将中间的机器设置为网关。
 
我以前做过一个有点相似的应用,和你这个不同的地方是我的所有的程序都是自己做的,并不需要“破解软件用户限制”。
我是通过多个客户向一个服务发送命令,此服务再转发,需要返回发送是否成功能的信息。

[1]IDTCPCLIENT--> [2](IDTCPSERVER-->IDTCPCLIENT)------>[3]TCPSERVER
发送请求 接受--传递给IDTCPCLIENT 发送给TCPSERVER

[1]IDTCPCLIENT<-- [2](IDTCPSERVER-->IDTCPCLIENT)<------[3]TCPSERVER
返回发送是否成功

 
后退
顶部