N
netants017
Unregistered / Unconfirmed
GUEST, unregistred user!
示意图
<---2---- ----4----->
[Server] [Client 代理服务器 Server] [Client 工作站]
---3----> <----1----
请求工作过程:
客户端[IdTCPClient]--------->[IdTCPServer]代理服务器[IdTCPClient]----------->unix服务器
响应工作过程:
客户端[IdTCPClient]<---------[IdTCPServer]代理服务器[IdTCPClient]<-----------unix服务器
我以前是用ClientSocket与ServerSocket做的,在代理服务器上ClientSocket与ServerSocket的数据交换
还好实现部分代码在后面。
现在我想用IdTCPServer与IdTCPClient来实现有几个问题想请教各位
1、我是否要当每有一个客户请求 在我的代理上都要创建一个相对应与UXIX連接的客户IdTCPClient
2、IdTCPServer与IdTCPClient在代理服器上如何进行数据交换。
3、如果各位手头上有相似功能的CODE 请帖上一点。
多谢!!!!!
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
var
i,j: integer;
begin
j:=-1;
for i:=1 to sessions do {查找是否有空白项}
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 {无,新增一个}
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; {保存句柄,实现绑定}
session[j].Request:=false; {无请求}
session[j].client_connected:=true; {客户机已连接}
session[j].remote_connected:=false; {远程未连接}
edit1.text:=inttostr(sessions);
end;
for i:=1 to sessions do {判断是哪一个会话}
if session[i-1].Used and (session[i-1].SS_Handle=socket.sockethandle)
then
begin
//以下是对处工作站发送来的请求进行处理分析
str_request:=socket.ReceiveText;
str_tmp:='';
case strtoint(copy(str_request,1,4)) of
100: str_tmp:='0100'+ycbh+copy(str_request,5,19);
200:
begin
// 分调集离客户的预订单位号
end; // end of case
session[i-1].request_str:=str_tmp; {保存整理后的请求数据}
tmp:=session[i-1].request_str; {存放到临时变量}
if tmp<>'' then {有效的请求}
begin
case strtoint(copy(str_request,1,4)) of
100: memo1.lines.add('查询请求('+inttostr(socket.sockethandle)+'): '+tmp);
200: memo1.lines.add('转帐请求('+inttostr(socket.sockethandle)+'): '+tmp);
end; //end of case
if not session[i-1].remote_connected then {假如远征尚未连接}
begin
session[i-1].Request:=true; {置请求数据就绪标志}
session[i-1].CSocket.host:=yh_ipaddress; {设置远程主机地址}
session[i-1].CSocket.port:=strtoint(yh_port); {设置端口}
session[i-1].CSocket.active:=true; {连接远程主机}
session[i-1].Lookingup:=true; {置标志}
session[i-1].LookupTime:=0; {从0开始计时}
end
else {假如远程已连接,直接发送请求}
session[i-1].CSocket.socket.sendtext(session[i-1].request_str);
end //end of if not session[i-1].remote_connected then
else
memo1.lines.add('客户无效请求('+inttostr(socket.sockethandle)+')'+socket.ReceiveText);
//end of if tmp<>'' then
break; {停止循环}
end;
end;
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
i,j: integer;
rec_text,answer,sql:string;
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); {接收数据}
rec_text:=socket.ReceiveText;
//要对返回的数据进行整理,要对响应代码进行判断。
case strtoint(copy(rec_Text,1,4)) of
100: if copy(rec_text,5,4)='1111' then //为全'1111'时表示正常返回
begin
answer:=copy(rec_text,49,12);
memo1.lines.add('查询正常返回('+inttostr(session[i-1].SS_Handle)+'): '+rec_text);
end
else
begin
answer:='error';
memo1.lines.add('查询失败返回('+inttostr(session[i-1].SS_Handle)+'): '+rec_text);
end;
// end of 100
200: begin
//更新预订单表中的订单状态!!!
//写入日志到数据库
end; //end of 200
else
begin
answer:='error answer';
memo1.lines.add('返回信息格式不对('+inttostr(session[i-1].SS_Handle)+'): '+rec_text);
end;
end;
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].SendText(answer);
break;
end;
break;
end;
end;
<---2---- ----4----->
[Server] [Client 代理服务器 Server] [Client 工作站]
---3----> <----1----
请求工作过程:
客户端[IdTCPClient]--------->[IdTCPServer]代理服务器[IdTCPClient]----------->unix服务器
响应工作过程:
客户端[IdTCPClient]<---------[IdTCPServer]代理服务器[IdTCPClient]<-----------unix服务器
我以前是用ClientSocket与ServerSocket做的,在代理服务器上ClientSocket与ServerSocket的数据交换
还好实现部分代码在后面。
现在我想用IdTCPServer与IdTCPClient来实现有几个问题想请教各位
1、我是否要当每有一个客户请求 在我的代理上都要创建一个相对应与UXIX連接的客户IdTCPClient
2、IdTCPServer与IdTCPClient在代理服器上如何进行数据交换。
3、如果各位手头上有相似功能的CODE 请帖上一点。
多谢!!!!!
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
var
i,j: integer;
begin
j:=-1;
for i:=1 to sessions do {查找是否有空白项}
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 {无,新增一个}
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; {保存句柄,实现绑定}
session[j].Request:=false; {无请求}
session[j].client_connected:=true; {客户机已连接}
session[j].remote_connected:=false; {远程未连接}
edit1.text:=inttostr(sessions);
end;
for i:=1 to sessions do {判断是哪一个会话}
if session[i-1].Used and (session[i-1].SS_Handle=socket.sockethandle)
then
begin
//以下是对处工作站发送来的请求进行处理分析
str_request:=socket.ReceiveText;
str_tmp:='';
case strtoint(copy(str_request,1,4)) of
100: str_tmp:='0100'+ycbh+copy(str_request,5,19);
200:
begin
// 分调集离客户的预订单位号
end; // end of case
session[i-1].request_str:=str_tmp; {保存整理后的请求数据}
tmp:=session[i-1].request_str; {存放到临时变量}
if tmp<>'' then {有效的请求}
begin
case strtoint(copy(str_request,1,4)) of
100: memo1.lines.add('查询请求('+inttostr(socket.sockethandle)+'): '+tmp);
200: memo1.lines.add('转帐请求('+inttostr(socket.sockethandle)+'): '+tmp);
end; //end of case
if not session[i-1].remote_connected then {假如远征尚未连接}
begin
session[i-1].Request:=true; {置请求数据就绪标志}
session[i-1].CSocket.host:=yh_ipaddress; {设置远程主机地址}
session[i-1].CSocket.port:=strtoint(yh_port); {设置端口}
session[i-1].CSocket.active:=true; {连接远程主机}
session[i-1].Lookingup:=true; {置标志}
session[i-1].LookupTime:=0; {从0开始计时}
end
else {假如远程已连接,直接发送请求}
session[i-1].CSocket.socket.sendtext(session[i-1].request_str);
end //end of if not session[i-1].remote_connected then
else
memo1.lines.add('客户无效请求('+inttostr(socket.sockethandle)+')'+socket.ReceiveText);
//end of if tmp<>'' then
break; {停止循环}
end;
end;
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
i,j: integer;
rec_text,answer,sql:string;
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); {接收数据}
rec_text:=socket.ReceiveText;
//要对返回的数据进行整理,要对响应代码进行判断。
case strtoint(copy(rec_Text,1,4)) of
100: if copy(rec_text,5,4)='1111' then //为全'1111'时表示正常返回
begin
answer:=copy(rec_text,49,12);
memo1.lines.add('查询正常返回('+inttostr(session[i-1].SS_Handle)+'): '+rec_text);
end
else
begin
answer:='error';
memo1.lines.add('查询失败返回('+inttostr(session[i-1].SS_Handle)+'): '+rec_text);
end;
// end of 100
200: begin
//更新预订单表中的订单状态!!!
//写入日志到数据库
end; //end of 200
else
begin
answer:='error answer';
memo1.lines.add('返回信息格式不对('+inttostr(session[i-1].SS_Handle)+'): '+rec_text);
end;
end;
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].SendText(answer);
break;
end;
break;
end;
end;