现在网络的流行,使得服务器程序得到了广泛的应用,那么我们使用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设计强大的服务器程序的更多相关文章

  1. 在 Windows Azure 上设计多租户应用程序

    作者:Suren Machiraju 和 Ralph Squillace 审校:Christian Martinez.James Podgorski.Valery Mizonov 和 Michael ...

  2. 性能追击:万字长文30+图揭秘8大主流服务器程序线程模型 | Node.js,Apache,Nginx,Netty,Redis,Tomcat,MySQL,Zuul

    本文为<高性能网络编程游记>的第六篇"性能追击:万字长文30+图揭秘8大主流服务器程序线程模型". 最近拍的照片比较少,不知道配什么图好,于是自己画了一个,凑合着用,让 ...

  3. R语言服务器程序 Rserve详解

    R语言服务器程序 Rserve详解 R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大. R语言作为统计学一门语言,一直在小众领域闪耀着光芒.直到 ...

  4. Java实现Linux下服务器程序的双守护进程

    作者:Vinkn 来自http://www.cnblogs.com/Vinkn/ 一.简介 现在的服务器端程序很多都是基于Java开发,针对于Java开发的Socket程序,这样的服务器端上线后出现问 ...

  5. 服务器编程入门(5)Linux服务器程序规范

    问题聚焦:     除了网络通信外,服务器程序通常还必须考虑许多其他细节问题,这些细节问题涉及面逛且零碎,而且基本上是模板式的,所以称之为服务器程序规范.     工欲善其事,必先利其器,这篇主要来探 ...

  6. Linux 高性能服务器编程——Linux服务器程序规范

    问题聚焦:     除了网络通信外,服务器程序通常还必须考虑许多其他细节问题,这些细节问题涉及面逛且零碎,而且基本上是模板式的,所以称之为服务器程序规范.     工欲善其事,必先利其器,这篇主要来探 ...

  7. 【翻译】使用Ext JS设计响应式应用程序

    原文:Designing Responsive Applications with Ext JS 在当今这个时代,用户都希望Web应用程序无论在形状还是大小上,既能在桌面电脑,也能在移动设备上使用.使 ...

  8. 用Java实现多线程服务器程序

    一.Java中的服务器程序与多线程 在Java之前,没有一种主流编程语言能够提供对高级网络编程的固有支持.在其他语言环境中,实现网络程序往往需要深入依赖于操作平台的网络API的技术中去,而Java提供 ...

  9. Delphi XE8中开发DataSnap程序常见问题和解决方法 (-)启动创建好的DBExpress工程时候报错了!

    当我们成功创建了使用DBExpress的DataSnap的服务器和客户端程序后,我们关闭了当前工程,当我们再次打开时候,有可能会出现这样的问题: 问题原因:这个问题是因为当前工程组默认启动的是客户端工 ...

随机推荐

  1. (转)oracle常用的数据字典

    一.oracle数据字典主要由以下几种视图构成: .user视图 以user_为前缀,用来记录用户对象的信息 .all视图 以all_为前缀,用来记录用户对象的信息及被授权访问的对象信息 .dba视图 ...

  2. C# 进制转换 在什么情况下使用16进制,字节数组,字符串

    C# 进制转换 Admin2013年9月18日 名人名言:从工作里爱了生命,就是通彻了生命最深的秘密.——纪伯伦 1.请问c#中如何将十进制数的字符串转化成十六进制数的字符串 //十进制转二进制Con ...

  3. UVA 10970 - Big Chocolate 洪水@。@

    先横着切m-1刀,矩形巧克力就变成了1*n (有m个)然后每个都要切n-1下,所以有 m*(n-1) +(m-1)= n*m-1 #include<cstdio> int main() { ...

  4. python的报错

    1;; //////////////////////////////////////////////////////////////////////////////////////////////// ...

  5. SetForegroundWindow的正确用法

    在SetForegroundWindow之前比较早的时候(比如main函数里)调用一下以下代码: DWORD dwTimeout = -1; SystemParametersInfo(SPI_GETF ...

  6. Mybatis全面详解——下(学习总结)

    原文地址:https://blog.csdn.net/ititii/article/details/79999481 一.Mybatis关联查询映射 这里采用一个案例来进行分析:(下面的案例都是采用M ...

  7. Your algorithm's runtime complexity must be in the order of O(log n).

    Given a sorted array of integers, find the starting and ending position of a given target value. You ...

  8. php json字符串转为数组或对象

    从网上查到的方法是 用get_object_vars 把类类型转换成数组 然后在用foreach  遍历即可 $array = get_object_vars($test); $json= '[{&q ...

  9. tig install ncursesw

    ./configure --prefix=/home/xxx/.local/ --with-ncursesw make[xxx$ ldd src/tig linux-vdso.so.1 => ( ...

  10. [Grid Layout] Use auto-fill and auto-fit if the number of repeated grid tracks is not to be def

    What about the situation in which we aren’t specifying the number of columns or rows to be repeated? ...