Delphi2010中DataSnap高级技术(3)—DataSnap服务器如何得到客户端的IP和端口

作为一个服务器软件,必须做到对客户端强有力的控制,想要控制,就必须得到客户端的网络基本信息,比如客户端IP和端口。有了客户端IP就能随心所欲操控客户端,比如终止某些客户端的连接、限制功能等等。

在delphi2010中的datasnap服务器如何获得客户端ip,的确花了我点时间,奇怪为什么这个功能不做的更人性化点呢,功能总是藏着掖着。还得让程序员像寻宝一样摸索,浪费时间。现在把我整理的结果奉献给大家,免得大家在花时间研究这个。

另外,通过研究发现,DSConnectEventObject.ChannelInfo.Id 属性实际上是内存地址,并不是一个简单的数字。

 

以下代码红色部分是关键。

uses IdTCPConnection;

......

procedure TServerContainer1.DSServer1Connect
  (DSConnectEventObject: TDSConnectEventObject);
var
  ClientConnection: TIdTCPConnection;
begin
  with Form1 do
  begin
    dsShowDataSet.Append;
    dsShowDataSet['ClientConnectTime'] := Now;

    if DSConnectEventObject.ChannelInfo <> nil then
    begin
      ClientConnection := TIdTCPConnection(DSConnectEventObject.ChannelInfo.Id);

      dsShowDataSet['ClientID'] := DSConnectEventObject.ChannelInfo.Id;
      dsShowDataSet['ClientIP'] := ClientConnection.Socket.Binding.PeerIP +
        ':' + IntToStr(ClientConnection.Socket.Binding.PeerPort);
      dsShowDataSet['ServerIP'] := ClientConnection.Socket.Binding.IP + ':' +
        IntToStr(ClientConnection.Socket.Binding.Port);
    end;

    dsShowDataSet['ClientUserName'] := DSConnectEventObject.ConnectProperties
      [TDBXPropertyNames.UserName];
    dsShowDataSet['ClientUserPassword'] :=
      DSConnectEventObject.ConnectProperties[TDBXPropertyNames.Password];
    dsShowDataSet['ServerInfo'] := DSConnectEventObject.ConnectProperties
      [TDBXPropertyNames.ServerConnection];
    dsShowDataSet.Post;
  end;
end;

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sunstone/archive/2009/12/12/4990189.aspx

时间: 2024-11-10 00:42:23

Delphi2010中DataSnap高级技术(3)—DataSnap服务器如何得到客户端的IP和端口的相关文章

Delphi2010中DataSnap高级技术(2)—DataSnap服务端和客户端发布分发方法

这几天继续研究DataSnap技术. 针对服务器和客户端软件,如何发布呢?经过研究发现,分发方法非常简单! 服务器发布方法: 1.在unit ServerMethodsUnit1单元中,添加uses MidasLib;(添加MidasLib的目的是省去发布Midas.dll) 2.我用的是火鸟数据库,只需拷贝dbxfb.dll和fbclient.dll 分发的服务器软件只需三个文件:你的服务器程序.dbxfb.dll 和 fbclient.dll 客户端发布方法: 1.在客户端程序中加上uses

Delphi2010中DataSnap高级技术(4)—TCP keepAlive和KeepAliveInterval参数详解

Delphi2010中DataSnap,如果客户端异常掉线或拔掉网线,那么在服务端会留下一个TCP连接,这个连接会变成死连接(经过测试,如果windows的TCP保持连接禁用的话,三个小时该死连接还不消失).如果大量客户端并发,出现的死TCP连接过多,服务器内存和端口将会增加,直到占满服务器的端口和耗尽内存为止.如果这样的话,服务器无法健壮稳定的运行. 大家可以另开线程来监控客户端连接,但是今天要给大家讲解的不是这个方法,而是使用TCP协议自带的心跳包功能解决这个问题. 大家先了解一下 TCP

Delphi2010中DataSnap高级技术(5)—建立稳定服务程序之TCP心跳包的使用

为了能让我们的服务程序更加稳定,有些细节问题必须解决.就如上一讲中提到的客户端拔掉网线,造成服务器上TCP变成死连接,如果死连接数量过多,对服务器能长期稳定运行是一个巨大的威胁. 另外,经过测试,如果服务器上有TCP死连接,那么服务程序连接数据库,也会产生那个一个死连接.这样的话,给数据库服务器也造成威胁.所以,服务器程序编写的好坏,直接影响系统的稳定性! 如何解决TCP死连接的问题,有多种方法,其中最有效的就是心跳包技术. 我们在DSServer的OnConnect事件中加入心跳包代码 use

Delphi2010中DataSnap高级技术(7)—TDSServerClass中Lifecycle生命周期三种属性说明

Lifecycle 三种属性: Session.Invocation.Server 这三种属性都用在什么情况,有什么要注意的事项,Delphi2010中罕有说明. 如果乱用这三种属性,你的服务程序有可能崩溃,数据混乱,内存占用大,效率低等问题! 下面我对这三种属性的使用环境逐一介绍: 1. Session 说明:这是delphi2010中默认属性,也是delphi推荐设置.Session会为每个来自客户端的链接,建立一个线程来实例化.实例化是什么概念呢?就是这个线程把所有你将要用到的类.函数等等

Delphi2010中DataSnap高级技术(6)—加强服务程序对访问者的控制能力

1)作为一个服务程序,如果不限制客户端访问数量,后果将是很可怕的.如果有人恶搞,服务器不堪重负,内存将耗尽,最终服务器将宕机.如何限制访问者的数量呢? 我们可以设置一个变量,来记录来访者的数量,如果超过我们既定的数字,那么后续的连接服务器请求,都将被断掉. 2)限制了访问数量,但是如果不做密码身份认证,无关的人员也将能登陆服务器!解决办法是客户端传入用户名和密码,如果用户名和密码不正确,连接将被挂断. 在客户端的SQLConnection1中driver分类的username和password属

利用高级技术实现可靠性服务器

  圣诞节就快来临了,在IT人员的愿望清单里,可靠的服务器必不可少.随着虚拟化技术的出现,一台物理服务器承载了几十个工作负载,对可靠性的需求就更加强烈,因为硬件故障与失败的迁移都会导致服务器崩溃,那就麻烦了. 与服务器可靠性相关的技术,如冗余电源供应.内存错误监测与纠正都进行得有点慢.需要识别.容纳与解决故障条件的协议与行为花费太昂贵,而且横跨所有层的交互操作并没有广泛的实施标准.本文介绍一些最新的工具,方便IT人士打造可靠的服务器. 存储子系统可靠性 检查奇偶校验位与错误纠正码ECC的技术可追

http协议-如何运用asp.net技术通过IIS服务器中的HTTP协议访问同局域网内另一台电脑内的文件

问题描述 如何运用asp.net技术通过IIS服务器中的HTTP协议访问同局域网内另一台电脑内的文件 如何运用asp.net技术通过IIS服务器中的HTTP协议访问同局域网内另一台电脑内的文件,不能设为共享,因为那是做为服务器的机器,该怎么做,求大神指教,帮帮忙,拜托了,拜托了,拜托了....... 解决方案 另一台机器开web server,提供HTTP文件下载,然后这台机器就可以用HTTP协议获取文件 解决方案二: 大神,怎么编写VS2012的C#代码实现这个功能呀,新手,求帮助,帮帮我吧小

Ajax 中的高级请求和响应

ajax|高级|请求|响应 对于很多 Web 开发人员来说,只需要生成简单的请求并接收简单的响应即可:但是对于希望掌握 Ajax 的开发人员来说,必须要全面理解 HTTP 状态代码.就绪状态和 XMLHttpRequest 对象.在本文中,Brett McLaughlin 将向您介绍各种状态代码,并展示浏览器如何对其进行处理,本文还给出了在 Ajax 中使用的比较少见的 HTTP 请求. 在本系列的 上篇文章 中,我们将详细介绍 XMLHttpRequest 对象,它是 Ajax 应用程序的中心

[四天学会ajax] 学习Ajax教程第三天,Ajax 中的高级请求和响应

ajax|高级|教程|请求|响应 对于很多 Web 开发人员来说,只需要生成简单的请求并接收简单的响应即可:但是对于希望掌握 Ajax 的开发人员来说,必须要全面理解 HTTP 状态代码.就绪状态和 XMLHttpRequest 对象.在本文中,Brett McLaughlin 将向您介绍各种状态代码,并展示浏览器如何对其进行处理,本文还给出了在 Ajax 中使用的比较少见的 HTTP 请求. 在本系列的 上篇文章 中,我们将详细介绍 XMLHttpRequest 对象,它是 Ajax 应用程序