远程调用的问题(200分)

  • 主题发起人 主题发起人 muhx
  • 开始时间 开始时间
M

muhx

Unregistered / Unconfirmed
GUEST, unregistred user!
为了方便说明问题,使用下面例子
客户端登录服务器,过程如下
1.客户端发送登录请求 function Login(const ACode, APassword: string): Boolean;
2.将这个命令组织成报文并发送给服务器,通讯部分略过不必考虑;
3.服务端接收报文后解析,并查询服务器,执行相应操作,得到结果,假设结果就是一个Boolean型的值,True表示登录成功,Flase表示登录失败
4.服务器将结果发报文给客户端,客户端接收得到结果
我现在的做法是使用一个全局变量(实际是类的数据成员)表示登录状态,当客户端发送完报文后就等待状态是否变化,伪代码如下:
private
FLogined: Boolean;
//是否登录成功, 初始值为False
function Login(const ACode, APassword: string): Boolean;
begin
Result := False;
{ 组织报文并发送给服务端 }
SendPackage(ACode, APassword);
{ 等待服务端返回结果 }
for I := 1 to 20do
begin
if FLogined then

begin
Result := True;
Exit;
end;
Application.ProcessMessage;
Sleep(20);
end;
end;

{ 客户端接收到服务端返回报文后直接调用这个过程 }
procedure LoginResult;
begin
FLogined := True;
if RecvPackage then
FLogined := True;
end;

现在我觉得用这个方法虽然能解决问题但是比较笨,若有很多个交易就要有很多的状态变量,不知道大家有没有好的方法
先送200分,若不够另外开贴送分:)
 
function Login(const ACode, APassword: string): Boolean;
begin
Result := False;
{ 组织报文并发送给服务端 }
SendPackage(ACode, APassword);
{ 等待服务端返回结果 }
for I := 1 to 20do
begin
if FLogined then

begin
Result := True;
Exit;
end;
Application.ProcessMessage;
Sleep(20);
end;
end;

//这种写法觉得不是很好
 
请详细说一下:)
 
从我个人看法你这段代码应该是使用非阻塞.
for I := 1 to 20do
begin
if FLogined then

begin
Result := True;
Exit;
end;
Application.ProcessMessage;
Sleep(20);
end;
1.以上代码是主观判断等待服务器处理完成和网传输回来, 但是你的服务器忙或者网络环境问题, 你说你上面的代码很可能会超时. 然后你又得增加循环次数来解决问题.
2.若有很多个交易就要有很多的状态变量 我也不太清楚你的多个交易是什么. 我的做法是每个业务处理都是一个短链接来处理, 所以不会存在多个状态. 业务处理完链接就断开了. 也就是整个客户端只有一个长链接.
 
呵呵看的少说的更少
看来我该离开了:)
 
其他懒的看了,就说这段登陆代码,kk2000说的是建立连接,可能在程序中要建立多个连接,那么如果用这段代码确实需要多个变量,而看LZ实际想的却是一次性的登陆系统,而又不想浪费太多的等待时间(如果把for I := 1 to 20do
begin
if FLogined then

begin
Result := True;
Exit;
end;
Application.ProcessMessage;
Sleep(20);
end;
这段代码改为SLEEP(AOUTTIME);RESULT := FLOGINED;则会浪费时间
),其实这种构思挺巧妙的。
恩,也许可以再加个带默认值的登陆超时参数,然后在FOR那段里分解它,这样感觉更灵活些,而这个登陆超时参数也许还可以根据PING值来定,这些都只是想法,我可没实现过,呵呵
 
多人接受答案了。
 
后退
顶部