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

delphi 三层的一些有关问题

2012-08-13 
delphi 三层的一些问题大家好:请教一下,delphi做三层服务器端:remote data module+ADOConnection+ADOQuery

delphi 三层的一些问题
大家好:
  请教一下,delphi做三层
  服务器端:remote data module+ADOConnection+ADOQuery+DataSetProvider
  客户端:DCOMConnection+ClientDataSe

想请教一下:这样做,
1.服务器端怎样查看有多少个客户端连接,在必要的时候,怎样踢掉个别客户端
2.有多个客户端连接的时候,修改同一记录的可能性,怎样解决啊?

[解决办法]
1.服务器端怎样查看有多少个客户端连接,在必要的时候,怎样踢掉个别客户端
re:我的三层不是remote data module做的,给你个思路,不一定对。在服务器建立一个SESSION列表,当用户登陆则记录,未找到SESSION的用户则不让他执行服务器的方式。
2.有多个客户端连接的时候,修改同一记录的可能性,怎样解决啊?
re:在三层更新中有三种更新模式,对于一般不太重要的数据以主键更新即可减少冲突,重要的数据以比对所有字段更新方式。当一个用户修改过后,另一用户自然无法提交上去。让他刷新后再修改即可。
[解决办法]
加一个辅助的socket通信,来管理登陆用户
[解决办法]
midas没这能力
[解决办法]
把这个功能作为一个普通功能:每个用户连接前先注册,所有的业务功能增加一个是否允许的判断
判断依据就是注册信息
[解决办法]
Q:1.服务器端怎样查看有多少个客户端连接,在必要的时候,怎样踢掉个别客户端
A:这个可以在你进行Login成功的时候,记录下当前用户,并且记录一个失效时间,比如说一个小时, 如果一个小时之前客户端未曾执行过任何Sql语句, 那就说明LogOut了.
至于踢掉客户,理论上可以实现. 比如,通过拒绝执行客户端发来的指令. 但也有一个盲点,就是肯定会建立连接的

Q:2.有多个客户端连接的时候,修改同一记录的可能性,怎样解决啊?
A:这个木有其它办法的噢.三层本身就存在这个问题. 
当一个客户更改了, 而另一个客户要去更新的话,就先提示要刷新后才可以更改.
要不,就额外开一个Socket,在服务器上检测是否做修改,如果做了修改,就给所有用到了这当前修改表的客户端发送消息,告诉他们数据被它人修改.然后再做相应的动作. 不过. 这样做,会加重服务器的负担.. 
当然, 一般情况下,也都不会这么做的,除非是要求非常严格的程序..
一般就你提示数据被他人修改了,然后让刷新后再修改保存就可以了.
[解决办法]
在你的服务器可以加一个StringList类,当连接了服务器的客户端DCOM,就生成一个记录加载到StringList中,并给它个名称,当断开了,就剔除。这样就可以进行管理了。

代码大概这样写。

Delphi(Pascal) code
TDCOM = packed record  _IP     : string;  _Handle : integer;  end;PDCOM = ^TDCOM;var  DCOMList : TStringList;//窗体Create时  DCOMList := TStringList.Create;//当连接后procedure AddList()var  PD:PDCOM;begin  try    new(PD);    PD^._IP := '客户端IP';    PD^._Handle  := '客户端DCOM的Handle';    DCOMList.AddObject(IntToStr('客户端DCOM的Handle'),TObject(PD));  except  end;end;//当断开后procedure DelList(_Handle:Integer)var  i :Integer;  PD:PDCOM;begin  for i := 0 to DCOMList.Count - 1 do   begin    if (PDCOM(DCOMList.Objects[i]^)._Handle = _Handle)) then      DCOMList.Delete(i);  end;end;//可以把连接的客户端信息用ListBox(DCOMList中的信息)显示出来,需要关闭哪个,直接Close就可以。//同时操作ListBox控件以及DCOMList。大体思路就是这样。
[解决办法]
探讨
大家好:
请教一下,delphi做三层
服务器端:remote data module+ADOConnection+ADOQuery+DataSetProvider
客户端:DCOMConnection+ClientDataSe

想请教一下:这样做,
1.服务器端怎样查看有多少个客户端连接,在必要的时候,怎样踢掉个别客户端
2.有多个客户端连接的时候,修改同一记录的可能……

[解决办法]
在服务中,只要有人上线,就会激发一个动态连接。设一个计数器(FClientCount上线数)。
我的代码如下:自己参考做吧!
 
1、
procedure TTServer.RemoteDataModuleCreate(Sender: TObject);
begin
ADOCon.Connected:=False;
// ADOCon.ConnectionString:='Provider=SQLOLEDB.1;Password=sa;Persist Security Info=True;User ID=sa;Initial Catalog=¾´ÀÏÔºÊý¾Ý¹ÜÀí;Data Source=LYHOO2';
ADOCon.ConnectionString:=ConnectionString;
ADOCon.Connected:=True;
FClientCount:= FClientCount+1;
end;

2、
procedure TTServer.RemoteDataModuleDestroy(Sender: TObject);
begin
FClientCount:= FClientCount-1;
end;

3、
procedure TServerFrm.Timer1Timer(Sender: TObject);
begin
StatusBar1.Panels[3].Text:='在线: '+ IntToStr(FClientCount);
end;

热点排行