如何使用Delphi设计强大的服务器程序
现在网络的流行,使得服务器程序得到了广泛的应用,那么我们使用Delphi如何设计出强壮的服务器呢?
有人说,如果要设计服务器的话,一定要使用VC来设计,其实这个人说的有一定道理,因为如果你要使用Delphi来设计服务器的话,要想设计高效的服务器就不要使用Delphi带来的大部分的控件(最好不要使用Delphi控件),为什么呢?下面我会告诉大家。这样的话你全部使用API来设计服务器,就同VC没有太大的区别了。
使用Delphi来设计服务器程序,具体选择是使用窗体消息模式还是使用完成端口的模式,这主要看你的用户连接数量来决定。如果你的用户连接数量小于1000人的话,并且处理的数据量不大的话,可以使用窗体的消息模式来进行服务器的开发,而如果大于1000,这样最好使用完成端口来开发服务器。我这里建议大家最好使用完成端口模式,因为你不可能保证你的用户数量不变化,同时由于你的服务器如果运行一段时间没有问题的话,最好做成WIN 的服务程序,这样可以保证后期的维护比较少。
现在介绍你在开发Delphi服务器的时候需要注意地方:
1 不要在程序中使用String变量
这个也是在实际的开发过程中发现的,我最开始开发的时候,为了简单一些,就大量使用String变量来开发程序,但程序总是在运行一段时间后出现问题,后来查原因也不太清楚,到网上查资料,发现有人介绍不要使用String来做变量,将自己的程序全部修改成数组问题就基本解决了。
2 使用快速的加密算法如XOR 加密或DES加密等算法
服务器在与客户端传递的时候一定要进行加密,但使用什么类型的加密算法呢?不要使用那种需要大量运算的算法如RSA等算法,最好使用XOR加密或DES换位加密算法,这样主要是满足普通的加密密文的要求,又保证服务器的运算速度。你也可以使用RSA加密密文,但这会造成服务器处理变慢,而如果遇到大量的处理时候,很容易服务器就拒绝服务器。
3 使用原ADO函数来连接数据库
服务器程序通常都与数据库想结合,那么使用Delphi开发的时候,通常使用ADO的控件来制作,但如果你学习ADO手册会发现,对于服务器其实不需要控件来完成数据的操作。可以直接使用ADO相应的函数来完成。主要因为服务器程序与数据库通常都是比较简单的操作,没有很复杂的。所以使用原ADO模式就可以了。这样也减少由于ADO控件带来的问题。
4 应多使用“池”
服务器在设计的过程,一定要大量的变量支持,如果不使用池这个概念,你的程序将在创建和释放变量过程中浪费大量的时间。而且容易出现问题。设计过程中尽量不要创建和释放变量,如果能考虑到的变量,都在开始的运行的时候创建完毕。这样可以加快程序的运行速度,减少冲突。具体如何使用池这个技术,以后有时间再考虑写一篇介绍一下。
5 熟练使用指针操作
如果你不熟悉指针操作,那么你几乎无法设计出高效的服务器,如果你要真正的理解指针的概念,对于设计服务器来说就是如虎添翼。
下面举个例子,如使用Recv接收数据到Buffer中后,你需要进行解密操作,你可以使用下面的方法进行:
var
a,b:array [1..8] of byte;
i :integer;
ResultBuffer :array [1..Max] of byte;
begin
for i := 1 to Sizeof(Buffer) div 8 do
begin
move(Buffer[(i-1)*8+1],a,8);
Des(a,b,true); //这里使用DES加解密处理
move(b,ResultBuffer[(i-1)*8+1],8);
end;
end
大家看一看,上面的代码,思路很清楚,就是将接收到的Buffer分别按8个提到变量a中,再使用DES解密算法解密成b,再放回ResultBuffer中。
如果你熟练使用指针的话,效率会极大的提高
var
a,b:Pbyte;
i :integer;
ResultBuffer :array [1..Max] of byte;
begin
for i := 1 to Sizeof(Buffer) div 8 do
begin
a := @Buffer[(i-1)*8+1];
b := @ResultBuffer[(i-1)*8+1]
Des(a^,b^,true); //这里使用DES加解密处理
end;
end
再看一看上面的代码,是不是少了两个Copy数据的过程,这就是指针给你带来的高效。
6 多使用WSASend,WSARecv等WinSocket 2函数,不要使用Send,Recv函数
这个主要看你的服务器运行在什么系统中了,如果运行在WIN系统里,最好使用WSA系统的函数,因为Microsoft毕竟将它们都优化了。
7 合理使用线程池操作
高效的服务器一定要使用线程池技术,使用多少线程合理,需要线程处理什么样的数据。我个人认为如果要使用线程池的技术,一定要处理那些最费时的操作,如数据库的查询操作。
8 如果服务器使用了“池”的概念,这就又出现了一个问题,如何高效的分配池呢?
我在程序中大量的使用池,如线程池,数据池等。当数据到达的时候,如何分配池呢?这里就不告诉大家了,以后再专门写一篇关于池的文章。详细的介绍如何使用池。大家也可以自己考虑一下。
9 使用高效的字符串操作函数
因为服务器一定要进行大量的字符串运行,如果使用Delphi自带的函数来操作,就比较费时,所以这里推荐大家使用QStrings.pas字符串操作函数集,相信会对大家有帮助的。
10 优化你的SQL查询语句
你可以一方面优化SQL查询语句来提高运行效率,另一方面你还可以使用存储过程来更大的提高运行效率。(这些知识你需要看数据库的内容,这里具体如何优化就不说了。)
上面介绍是我的实践经验,不一定全对,希望大家能有帮助。如果有更好的方法,也可以讨论。
http://www.cnblogs.com/wxy8/archive/2010/11/17/1879529.html
如何使用Delphi设计强大的服务器程序的更多相关文章
- 在 Windows Azure 上设计多租户应用程序
作者:Suren Machiraju 和 Ralph Squillace 审校:Christian Martinez.James Podgorski.Valery Mizonov 和 Michael ...
- 性能追击:万字长文30+图揭秘8大主流服务器程序线程模型 | Node.js,Apache,Nginx,Netty,Redis,Tomcat,MySQL,Zuul
本文为<高性能网络编程游记>的第六篇"性能追击:万字长文30+图揭秘8大主流服务器程序线程模型". 最近拍的照片比较少,不知道配什么图好,于是自己画了一个,凑合着用,让 ...
- R语言服务器程序 Rserve详解
R语言服务器程序 Rserve详解 R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大. R语言作为统计学一门语言,一直在小众领域闪耀着光芒.直到 ...
- Java实现Linux下服务器程序的双守护进程
作者:Vinkn 来自http://www.cnblogs.com/Vinkn/ 一.简介 现在的服务器端程序很多都是基于Java开发,针对于Java开发的Socket程序,这样的服务器端上线后出现问 ...
- 服务器编程入门(5)Linux服务器程序规范
问题聚焦: 除了网络通信外,服务器程序通常还必须考虑许多其他细节问题,这些细节问题涉及面逛且零碎,而且基本上是模板式的,所以称之为服务器程序规范. 工欲善其事,必先利其器,这篇主要来探 ...
- Linux 高性能服务器编程——Linux服务器程序规范
问题聚焦: 除了网络通信外,服务器程序通常还必须考虑许多其他细节问题,这些细节问题涉及面逛且零碎,而且基本上是模板式的,所以称之为服务器程序规范. 工欲善其事,必先利其器,这篇主要来探 ...
- 【翻译】使用Ext JS设计响应式应用程序
原文:Designing Responsive Applications with Ext JS 在当今这个时代,用户都希望Web应用程序无论在形状还是大小上,既能在桌面电脑,也能在移动设备上使用.使 ...
- 用Java实现多线程服务器程序
一.Java中的服务器程序与多线程 在Java之前,没有一种主流编程语言能够提供对高级网络编程的固有支持.在其他语言环境中,实现网络程序往往需要深入依赖于操作平台的网络API的技术中去,而Java提供 ...
- Delphi XE8中开发DataSnap程序常见问题和解决方法 (-)启动创建好的DBExpress工程时候报错了!
当我们成功创建了使用DBExpress的DataSnap的服务器和客户端程序后,我们关闭了当前工程,当我们再次打开时候,有可能会出现这样的问题: 问题原因:这个问题是因为当前工程组默认启动的是客户端工 ...
随机推荐
- 11.5 Android显示系统框架_Vsync机制_黄油计划_三个方法改进显示系统
5. Vsync机制5.1 黄油计划_三个方法改进显示系统vsync, triple buffering, vsync虚拟化 参考文档:林学森 <深入理解Android内核设计思想>第2版 ...
- [RxJS] AsyncSubject: representing a computation that yields a final value
This lesson will teach you about AsyncSubject, another type of Subject with some replaying logic ins ...
- 算法 Tricks(六)— if 条件分支的简化
考虑下面的三分支的定义式: f=⎧⎩⎨⎪⎪a,b,a+b,x>yx<yx=y int f = 0; if (x >= y) f += a; if (x <= y) f += b ...
- okhttp的简介(二)之简单封装
前一篇文章简单的介绍了okhttp的简单使用.okhttp的简介(一):http://blog.csdn.net/wuyinlei/article/details/50579564 相信使用还是非常好 ...
- Qt 信号-槽的同步与异步处理
通常使用的connect,实际上最后一个參数使用的是Qt::AutoConnection类型:Qt支持6种连接方式.当中3中最主要: 1.Qt::DirectConnection(直连方式)(信号与槽 ...
- JVM调优基础 分类: B1_JAVA 2015-03-14 09:33 250人阅读 评论(0) 收藏
一.JVM调优基本流程 1.划分应用程序的系统需求优先级 2.选择JVM部署模式:单JVM.多JVM 3.选择JVM运行模式 4.调优应用程序内存使用 5.调优应用程序延迟 6.调优应用程序吞吐量 二 ...
- iOS开发runtime学习:一:runtime简介与runtime的消息机制
一:runtime简介:也是面试必须会回答的部分 二:runtime的消息机制 #import "ViewController.h" #import <objc/messag ...
- ios开发网络学习四:NSURLConnection大文件断点下载
#import "ViewController.h" @interface ViewController ()<NSURLConnectionDataDelegate> ...
- word-vba-microsoft(中英文)
中文 https://msdn.microsoft.com/zh-cn/vba/word-vba/articles/view-displaypageboundaries-property-word 英 ...
- MVC4中AJAX Html页面打开调用后台方法实现动态载入数据库中的数据
之前一直用window.onload方法来调用js方法来实现,今天纠结能不能换个方法实现. 非常明显是能够的. 在html前台页面引用js代码例如以下 @Scripts.Render("~/ ...