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

简介: 1)作为一个服务程序,如果不限制客户端访问数量,后果将是很可怕的。如果有人恶搞,服务器不堪重负,内存将耗尽,最终服务器将宕机。如何限制访问者的数量呢?我们可以设置一个变量,来记录来访者的数量,如果超过我们既定的数字,那么后续的连接服务器请求,都将被断掉。

1)作为一个服务程序,如果不限制客户端访问数量,后果将是很可怕的。如果有人恶搞,服务器不堪重负,内存将耗尽,最终服务器将宕机。如何限制访问者的数量呢?

我们可以设置一个变量,来记录来访者的数量,如果超过我们既定的数字,那么后续的连接服务器请求,都将被断掉。

2)限制了访问数量,但是如果不做密码身份认证,无关的人员也将能登陆服务器!解决办法是客户端传入用户名和密码,如果用户名和密码不正确,连接将被挂断。

在客户端的SQLConnection1中driver分类的username和password属性设置好用户名和密码。

3)尽量不要设置DSTCPServerTransport1的Maxthreads属性,还有数据库连接池也不要设置,delphi2010会有内存泄露,这两个参数保存默认即可。

在dsserver1控件的onconnect事件中加入如下代码(使用的是tcp/ip连接):

procedure TMainForm.DSServer1Connect
  (DSConnectEventObject: TDSConnectEventObject);
var
  val: TCP_KeepAlive;
  Ret: Integer;
  ClientConnection: TIdTCPConnection;
begin
  // 最大连接数量,验证来访者密码
  if (DSConnectEventObject.ChannelInfo = nil) or (Connections >= 500) or
    (DSConnectEventObject.ConnectProperties[TDBXPropertyNames.UserName]
      <> 'sunstone') or (DSConnectEventObject.ConnectProperties
      [TDBXPropertyNames.Password] <> 'mypassword') then
  begin
    DSConnectEventObject.DbxConnection.Destroy;
    // ClientConnection.Disconnect;
  end
  else
  begin
    // 获取socket连接
    ClientConnection := TIdTCPConnection(DSConnectEventObject.ChannelInfo.Id);
    ClientConnection.OnDisconnected := ClientDisconnectEvent;

    // 记录来访者数量
    inc(Connections);
    lblShowConnections.Caption := IntToStr(Connections);

    if Trim(ShowConnections.Cells[0, 1]) <> '' then
      ShowConnections.RowCount := ShowConnections.RowCount + 1;

    ShowConnections.Cells[0, ShowConnections.RowCount - 1] := IntToStr
      (DSConnectEventObject.ChannelInfo.Id);
    ShowConnections.Cells[1, ShowConnections.RowCount - 1] :=
      ClientConnection.Socket.Binding.PeerIP + ':' + IntToStr
      (ClientConnection.Socket.Binding.PeerPort);
    ShowConnections.Cells[2, ShowConnections.RowCount - 1] :=
      DSConnectEventObject.ConnectProperties[TDBXPropertyNames.UserName];
    ShowConnections.Cells[3, ShowConnections.RowCount - 1] :=
      DSConnectEventObject.ConnectProperties[TDBXPropertyNames.Password];
    ShowConnections.Cells[4, ShowConnections.RowCount - 1] := FormatDateTime
      ('yyyy-mm-dd hh:nn:ss', Now);
    // ShowConnections.Cells[6, ShowConnections.RowCount - 1] :=
    // DSConnectEventObject.ConnectProperties
    // [TDBXPropertyNames.ServerConnection];

    // 设置心跳包
    val.OnOff := 1;
    val.KeepAliveTime := 5000;
    val.KeepAliveInterval := 1000;
    WSAIoctl(ClientConnection.Socket.Binding.Handle, IOC_IN or IOC_VENDOR or 4,
      @val, SizeOf(val), nil, 0, @Ret, nil, nil);
  end;
end;


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sunstone/archive/2010/01/06/5145750.aspx

相关文章
|
JavaScript 前端开发 Java
正则表达式深度解析:匹配任意字符串
【4月更文挑战第1天】
7413 0
C#系列之ref和out的区别
C#系列之ref和out的区别
572 0
|
SQL 关系型数据库 MySQL
省市区管理sql数据表设计、以及全国省市区全部最新数据
省市区管理sql数据表设计、以及全国省市区全部最新数据
3457 0
省市区管理sql数据表设计、以及全国省市区全部最新数据
|
6月前
|
存储 人工智能
Ollama 本地运行 Qwen 3
本指南介绍如何安装和配置Ollama。首先,从官网下载Ollama并选择适合的安装方式:傻瓜式安装或指定路径安装。安装完成后,可通过系统环境变量配置模型下载路径(可选)。最后,运行对应模型命令进行测试使用,包括选择参数量、复制命令并在命令行工具中执行,验证安装是否成功。
3019 19
PyMuPDF 1.24.4 中文文档(五)(1)
PyMuPDF 1.24.4 中文文档(五)
187 3
|
应用服务中间件 开发工具 nginx
安装 Nginx 修改默认端口
用远程工具连接我们上次购买的机器,这里我要介绍一个知识点,博主使用的工具是 MobaXterm,这个工具有一个多操作的功能,在下图的位置可以开启多操作,然后连接你的服务器机子即可:
505 0
|
Nacos 微服务
项目实战3——feign调用404
项目实战3——feign调用404
497 0
|
安全 前端开发 rax
PWN练习---Stack_2
PWN练习---Stack_2
206 0
|
存储 网络协议 文件存储
什么是服务器?
【5月更文挑战第4天】什么是服务器?
1230 5
|
运维 Cloud Native 持续交付
构建未来:云原生架构在企业数字化转型中的关键角色
【5月更文挑战第29天】 在当今数字化浪潮中,企业面临着快速适应市场变化和持续创新的压力。云原生架构作为一种新兴的IT组织方法,以其独特的灵活性、可扩展性和敏捷性,成为推动企业转型的重要技术支撑。本文将探讨云原生架构的核心组件,包括容器化、微服务、持续集成/持续部署(CI/CD)和DevOps文化,并分析这些技术如何协同工作以支持企业的敏捷开发和自动化运维需求。通过深入剖析云原生架构的优势及其在不同行业中的应用案例,本文旨在为读者提供一个关于如何利用云原生技术实现业务目标和技术革新的综合视角。