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
分享到:
相关推荐
从Delphi6开始改名为DataSnap,直到D2007这个框架一直在使 用.D2009重新架构了DataSnap—移除COM依赖,使用TCP/IP以更轻量级的方式生成远程服务对象和客户端连接 能力.同时提供了与Delphi Prism2009开发的.NET程序通讯...
Delphi2010 DataSnap白皮书(翻译参考书)
Android studio客户端连接 Delphi XE REST DataSnap服务器
官方介绍Delphi2010下的DataSnap技术白皮书。
用Delphi2010的DATASNAP开发三层数据库应用源码。
Delphi2010 DataSnap白页中文2010年3月31日.pdf
翻译Marco Cantù的REST Servers in Delphi XE Using DataSnap,对于初次接触DATASNAP并尝试使用其REST方式开发WEB或多层服务器架构的人员对相关概念的正确认知极有帮助,同时也包含部分对DELPHI中使用JSON的方式有...
Delphi_2010,DataSnap白皮书,word版
在Delphi中使用Rest Severs的pdf书籍和相关源码,是学习Delphi Rest架构的很好资料。
Datasnap实现手机对服务器上数据库的操作(以sqlite数据库为例,通过Datasnap技术,让手机程序如何访问服务器上的数据库,并实现了对数据库的增删改操作)
花了一个星期的时间把Delphi 2010 Datasnap的三层架构搭了起来,对初学Datasnap非常有帮助,只需构搭了起来剩下的就是发挥你的工发大脑了。代码为分服务端和客户端
Delphi xe10 DataSnap 源码, Delphi xe10 DataSnap源码
delphi xe10.1的datasnap 三层结构完整服务端开发源码,适合新手学习使用,我个人在网上找了很多资料,搭建起来的平台
Delphi 10.1 Berlin DataSnap 开发手册 高清版 V2017-5-22.rar
一个用delphi写的服务器端DataSnap程序小例子,演示了DataSnap访问数据库的服务器端应用。
分8个章节讲述了如何用Delphi XE8 DataSnap开发系统
REST Servers in Delphi XE Using DataSnap.pdf
DELPHI XE2 中 DataSnap 点对点发送消息 官方示例
Delphi10.1 Berlin DataSnap 开发手册 PDF及源码
delphixe datasnap 学习资料