zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Ynoi2016 这是我自己的发明
    Luogu P5268 [SNOI2017]一个简单的询问
    Ynoi2017 由乃的玉米田
    BZOJ4320 [Shanghai2006]Homework
    JOISC2014C 歴史の研究
    莫队
    LOJ6119 「2017 山东二轮集训 Day7」国王
    Luogu P3295 [SCOI2016]萌萌哒
    10.1 进程间通信--消息队列
    9.2 网络协议理论
  • 原文地址:https://www.cnblogs.com/MaxWoods/p/2187838.html
Copyright © 2011-2022 走看看