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

我们看下该类的定义

 1  TDSConnectEventObject  =  class (TDSEventObject)
 2  public
 3     constructor  Create( const  ADbxContext: TDBXContext;  const  AServer: TDSCustomServer;  const  ATransport: TDSServerTransport;    const  AChannelInfo: TDBXChannelInfo;  const  ADbxConnection: TDBXConnection;  const  AConnectProperties: TDBXProperties);
 4  private
 5    FConnectProperties: TDBXProperties;
 6    FChannelInfo: TDBXChannelInfo;
 7  public     
 8     property  ConnectProperties: TDBXProperties  read  FConnectProperties  write  FConnectProperties;
 9     property  ChannelInfo: TDBXChannelInfo  read  FChannelInfo;
10  end ;

我们可以看到其中包含了两个属性ConnectProperties和ChannelInfo

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

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

 

然后 建立个DataSnap 2009的客户端工程

由于使用的DbExpress框架 客户端连接用的是TSQLConnection组件 

只要把Driver设置成Datasnap即可

连接的服务器地址通过HostName和Port来进行设定

 

下面我们就实现个简单的DEMO 客户端通过用户名和密码连接服务端 如果密码不争取服务端则断开连接

客户端主要函数

 1  procedure  TMainForm.ConnectClick(Sender: TObject);
 2  begin
 3    SQLConnection.Params.Values[ ' User_Name ' ] : =  UserName.Text;
 4    SQLConnection.Params.Values[ ' PassWord ' ] : =  Password.Text;
 5     try
 6      SQLConnection.Open;
 7      Connect.Enabled : =  False;
 8      DisConnect.Enabled : =  True;
 9     except
10      ShowMessage( ' 连接服务器失败! ' );
11     end ;
12  end ;
13 
14  procedure  TMainForm.DisConnectClick(Sender: TObject);
15  begin
16    SQLConnection.Close;
17    Connect.Enabled : =  True;
18    DisConnect.Enabled : =  False;
19  end ;

 

服务端主要函数

 1  procedure  TMainForm.DSServerConnect(DSConnectEventObject: TDSConnectEventObject);
 2  const
 3    SRemoteConnected  =  ' 远程客户端连接 %s:%d ' ;
 4    SUserNameAndPassword  =  ' 用户名: %s 密码: %s ' ;
 5    SAuthSuccess  =  ' 用户名密码认证成功 ' ;
 6    SAuthFailed   =  ' 用户名密码认证失败 ' ;
 7  var
 8    Conn: TIdTCPConnection;
 9  begin
10    Conn : =  TIdTCPConnection(DSConnectEventObject.ChannelInfo.Id);
11    LogMessage(Memo, Format(SRemoteConnected, [Conn.Socket.Binding.PeerIP, Conn.Socket.Binding.PeerPort]));
12     with  DSConnectEventObject.ConnectProperties  do
13     begin
14      LogMessage(Memo, Format(SUserNameAndPassword, [Values[ ' User_Name ' ], Values[ ' PassWord ' ]]));
15       if  (Values[ ' User_Name ' =  ' Admin ' and  (Values[ ' PassWord ' =  ' 123456 ' then
16        LogMessage(Memo, SAuthSuccess)
17       else
18       begin
19        LogMessage(Memo, SAuthFailed);
20        Conn.Disconnect;
21       end ;
22     end ;
23  end ;
24 
25  procedure  TMainForm.DSServerDisconnect(DSConnectEventObject: TDSConnectEventObject);
26  const
27    SRemoteDisConnected  =  ' 远程客户端断开连接 %s:%d ' ;
28  var
29    Conn: TIdTCPConnection;
30  begin
31    Conn : =  TIdTCPConnection(DSConnectEventObject.ChannelInfo.Id);
32    LogMessage(Memo, Format(SRemoteDisConnected, [Conn.Socket.Binding.PeerIP, Conn.Socket.Binding.PeerPort]));
33  end ;

 

注意:OnConnect事件中还可以使用另外一种方式拒绝客户端连接

在代码中抛出个异常即可 在客户端会捕捉到一个TDBXError的异常 显示'Remote error ' 加上异常显示的消息。 

 

 效果图如下:

 附上DEMO源码 DataSnapDemo_1.rar

转载于:https://www.cnblogs.com/Thinknet/articles/2051426.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值