DataSnap 2009 系列之一 (系统连接篇)

(连接篇)

Delphi 的MIDAS出来了这么多年终于有改进的版本了,COM-FREE的DataSnap 2009真是清爽了很多,DataSnap 2009 除了不支持回调和Intercept组件以外 其它的该有的都有了 而且还有很多强大的特性;

  第一篇就先写点DataSnap 2009连接方面可能要用到的东西,以后再继续写写关于生命周期的管理 对象池的应用 以及远程管理 远程方法调用等方面的东西吧。

  首先 建立个DataSnap 2009的服务器工程,一共用到三个组件:

    DSServer   服务配置组件 用于绑定其它的组件;

  DSServerClass 可以看作是一个类的工厂 用于导出需要远程调用的服务端模块;

  DSTCPServerTransport 传输组件 这里使用的是indy的tcpserver;

   将DSServerClass和DSTCPServerTransport 的Server设置成DSServer就可以了,客户端连接和断开连接时会触发DSServer的两个事件OnConnect和OnDisConnect,参数为 TDSConnectEventObject。

  我们看下该类的定义

TDSConnectEventObject = class(TDSEventObject)
 public
   constructor Create(const ADbxContext: TDBXContext; const AServer:  TDSCustomServer; const ATransport: TDSServerTransport;   const  AChannelInfo: TDBXChannelInfo; const ADbxConnection: TDBXConnection;  const AConnectProperties: TDBXProperties);
 private
   FConnectProperties: TDBXProperties;
   FChannelInfo: TDBXChannelInfo;
 public    
   property ConnectProperties: TDBXProperties read FConnectProperties  write FConnectProperties;
   property ChannelInfo: TDBXChannelInfo read FChannelInfo;
 end;

    我们可以看到其中包含了两个属性ConnectPropertiesChannelInfo:

    ConnectProperties 包含了客户端连接所传递的参数 Params 也就是一个TStrings的内容;

    ChannelInfo 里面有个很重的属性就是它的ID 其实是TIdTCPConnection对象的ID 所以我们可以直接强制转换成TIdTCPConnection;

  然后建立个DataSnap 2009的客户端工程,由于使用的DbExpress框架客户端连接用的是TSQLConnection组件,只要把Driver设置成Datasnap即可。连接的服务器地址通过HostName和Port来进行设定,下面我们就实现个简单的DEMO 客户端通过用户名和密码连接服务端 如果密码不争取服务端则断开连接。

  客户端主要函数

 procedure TMainForm.ConnectClick(Sender: TObject);
 begin
   SQLConnection.Params.Values['User_Name'] := UserName.Text;
   SQLConnection.Params.Values['PassWord'] := Password.Text;
   try
     SQLConnection.Open;
     Connect.Enabled := False;
     DisConnect.Enabled := True;
   except
     ShowMessage('连接服务器失败!');
   end;
 end;
 
 procedure TMainForm.DisConnectClick(Sender: TObject);
 begin
   SQLConnection.Close;
   Connect.Enabled := True;
   DisConnect.Enabled := False;
 end;

服务端主要函数

  procedure TMainForm.DSServerConnect(DSConnectEventObject:  TDSConnectEventObject);
 const
   SRemoteConnected = '远程客户端连接 %s:%d';
   SUserNameAndPassword = '用户名: %s 密码: %s';
   SAuthSuccess = '用户名密码认证成功';
   SAuthFailed  = '用户名密码认证失败';
 var
   Conn: TIdTCPConnection;
 begin
   Conn := TIdTCPConnection(DSConnectEventObject.ChannelInfo.Id);
   LogMessage(Memo, Format(SRemoteConnected,  [Conn.Socket.Binding.PeerIP, Conn.Socket.Binding.PeerPort]));
   with DSConnectEventObject.ConnectProperties do
   begin
     LogMessage(Memo, Format(SUserNameAndPassword,  [Values['User_Name'], Values['PassWord']]));
     if (Values['User_Name'] = 'Admin') and (Values['PassWord'] =  '123456') then
       LogMessage(Memo, SAuthSuccess)
     else
     begin
       LogMessage(Memo, SAuthFailed);
       Conn.Disconnect;
     end;
   end;
 end;
 
 procedure TMainForm.DSServerDisconnect(DSConnectEventObject:  TDSConnectEventObject);
 const
   SRemoteDisConnected = '远程客户端断开连接 %s:%d';
 var
   Conn: TIdTCPConnection;
 begin
   Conn := TIdTCPConnection(DSConnectEventObject.ChannelInfo.Id);
   LogMessage(Memo, Format(SRemoteDisConnected,  [Conn.Socket.Binding.PeerIP, Conn.Socket.Binding.PeerPort]));
 end;

注意:OnConnect事件中还可以使用另外一种方式拒绝客户端连接,在代码中抛出个异常即可 在客户端会捕捉到一个TDBXError的异常 显示'Remote error ' 加上异常显示的消息。 

  效果图如下:

时间: 2024-09-18 22:54:12

DataSnap 2009 系列之一 (系统连接篇)的相关文章

DataSnap 2009 系列之三 (生命周期篇)

(生命周期篇) DataSnap 2009的服务器对象的生命周期依赖于DSServerClass组件的设置,当DSServer启动时从 DSServerClass组件读取LifeCycle属性的值. 注意:LifeCycle的值由于在启动时就已经读取 启动后再修改LifeCycle的值将没有任何效果,LifeCycle属性的值可以是以下三种字符串之一. 1.Session 该选项为默认设置,每个连接都会建立一个独立的服务器对象为客户端提供服务,服务器对象在连接关闭后释放,因此多个客户端访问的是不

DataSnap 2009 系列之二 (方法篇)

(方法篇)     在过去客户端要调用远程服务器的方法需要通过在TLB里添加接口并且在服务器对象中实现,在DataSnap 2009中调用远程服务器的方法是基于delphi的RTTI机制的,想要一个类允许被远程调用需要做以下两点:     1.把该类和DSServerClass连接在一起     注意:DSServerClass必须设置要导出的类 否则会出现SOnGetClassNotSet的异常信息     2.该类必须使用$MethodInfo编译指令生成详细的RTTI信息     所以我们

SQL Server 临时表和表变量系列之踢馆篇

摘要 在面对SQL Server选择使用临时表还是表变量作为数据暂存问题时,有一个非常重要的选择标准便是性能,两者对于查询语句和DML性能表现到底如何呢?我相信,很多人的认识是片面的,或者是错误的.这里以一篇引用率很高的文章来作为反面教材来纠正那些片面和错误的认识,我暂且称之为"踢馆". 背景 在研究临时表和表变量该如何选择的时候,一篇文章叫着SQL Server Temp Table vs Table Variable Performance Testing文章引用率是非常高的.通读

Windows 10系统连接无线wifl网络设置方法

第一步.点击电脑桌面右下角的无线连接图标,在打开的信号列表中选择无线信号(勾选 自动连接),再点击 连接.如下图所示: 第二步.然后系统会要我们输入无线密码了,这个时间我们只需要填写你要连接的无线密码了,如果不知道可以进入无线路由器中查看,在此就不介绍了,填写好了我们点击 下一步.如下图所示: 第三步.如在弹出网络时我们只要点击 是,启用共享并连接到设备 为例.如下图所示: 在网络列表中点击该无线信号,会显示 已连接.如下图所示: 好了以上就是小编为各位整理的一篇关于Windows 10系统连接

电脑搜不到win7系统连接蓝牙是怎么解决

1.在桌面右击计算机之后我们点击"我的电脑-属性"如下所示 2.然后我们在进入之后我们点击"设备管理器"进入,如下所示 3.在设备管理器里找到蓝牙设备,正常驱动的话应该如下图这个状态,若有异常,蓝牙设备前面会有一个黄色的感叹号出现!当然你也可右键单击你的蓝牙设备,更新一下你的蓝牙驱动 好了上文是小编为各位整理的一篇解决你电脑搜不到win7系统连接蓝牙问题的解决办法了,希望这篇教程可以帮助到各位朋友.

win7系统连接宽带没有出现连接界面怎么回事

1.我们在win7界面中我们右击"网络"然后在窗口中点击"网络和共享中心"效果如下 2.在弹出的窗口中我们再 点击更改适配器设置 效果如下所示 3.好了进入之后我们再右击"宽带连接"选择属性,效果如下所示 4.在选项中,勾选"连接时显示进度"和"提示名称.密码和证书"确定即可 好了上文就是小编为大家整理的一篇关于win7系统连接宽带没有出现连接界面问题的解决办法了,希望这篇教程可以为大家带来帮助的呀.

ASP.NET 5系列教程(七)完结篇-解读代码

在本文中,我们将一起查看TodoController 类代码. [Route] 属性定义了Controller的URL 模板: [Route("api/[controller]")]   所有符合该模板类型的HTTP 请求都会被路由到该controller.在本例中, 路由的命名规范为对应Controller 的前缀,对于TodoController 类,路由模板为 "api/todo". HTTP 方法 [HttpGet].[HttpPost]和[HttpDele

细说360buy的内部结构系列 SEO不完美篇(2)

前段时间写了一篇"细说360buy的内部结构系列 - seo不完美篇(1)",介绍了一下360buy之中,并不完美的几点,下面笔者接着来写一下第一部分,进一步探讨seo并不完美的部分,虽并非完美,但是有一些却真正的对用户会有所帮助. 3)地区商品分类页的内容大量重复 相信很多朋友在京东上购物之后,总是会被京东上的购买过后的记录所直接跳转到该地区的网页之上,而实现对于用户体验最完美的解释,但是呢,对于seo而言的话,却有一定的不恰当之处,具体说来如下,我们选取了浙江和天津两个笔记本省的页

细说360buy的内部结构系列 - seo不完美篇(1)

很多时候,当我们还在追求完美性质的seo的时候,我们总是会忘记一句话"世界上没有绝对完美的人和事",无论什么,完美总是不会存在的的,我们可以刻意去追求完美,但是也应该试想一下完美的意义是什么,在seo中,我们追求完美是为了用户体验,但是并非完美的seo才是用户体验最大的提高,在写完"细说360buy的内部结构系列 - title标题篇"之后,请看-细说360buy的内部结构系列 - seo不完美篇,讲述一下京东不完美的seo故事 1)head部分臃肿不堪 很多时候,