查到的一些类似贴子:
我公司的客户端程序通过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
)//为最后加入的