如何使用Delphi设计强大的服务器程序

2016-02-19 20:49 13 1 收藏

最近很多朋友喜欢上设计,但是大家却不知道如何去做,别担心有图老师给你解答,史上最全最棒的详细解说让你一看就懂。

【 tulaoshi.com - 编程语言 】

  现在网络的流行,使得服务器程序得到了广泛的应用,那么我们使用Delphi如何设计出强壮的服务器呢?

  有人说,如果要设计服务器的话,一定要使用VC来设计,其实这个人说的有一定道理,因为如果你要使用Delphi来设计服务器的话,要想设计高效的服务器就不要使用Delphi带来的大部分的控件(最好不要使用Delphi控件),为什么呢?下面我会告诉大家。这样的话你全部使用API来设计服务器,就同VC没有太大的区别了。

  使用Delphi来设计服务器程序,具体选择是使用窗体消息模式还是使用完成端口的模式,这主要看你的用户连接数量来决定。如果你的用户连接数量小于1000人的话,并且处理的数据量不大的话,可以使用窗体的消息模式来进行服务器的开发,而如果大于1000,这样最好使用完成端口来开发服务器。我这里建议大家最好使用完成端口模式,因为你不可能保证你的用户数量不变化,同时由于你的服务器如果运行一段时间没有问题的话,最好做成WIN 的服务程序,这样可以保证后期的维护比较少。

  现在介绍你在开发Delphi服务器的时候需要注意地方:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  1 不要在程序中使用String变量

  这个也是在实际的开发过程中发现的,我最开始开发的时候,为了简单一些,就大量使用String变量来开发程序,但程序总是在运行一段时间后出现问题,后来查原因也不太清楚,到网上查资料,发现有人介绍不要使用String来做变量,将自己的程序全部修改成数组问题就基本解决了。

  2 使用快速的加密算法如XOR 加密或DES加密等算法

  服务器在与客户端传递的时候一定要进行加密,但使用什么类型的加密算法呢?不要使用那种需要大量运算的算法如RSA等算法,最好使用XOR加密或DES换位加密算法,这样主要是满足普通的加密密文的要求,又保证服务器的运算速度。你也可以使用RSA加密密文,但这会造成服务器处理变慢,而如果遇到大量的处理时候,很容易服务器就拒绝服务器。

  3 使用原ADO函数来连接数据库

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  服务器程序通常都与数据库想结合,那么使用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.tulaoshi.com/n/20160219/1624618.html

延伸阅读
标签: ASP
  在ASP中采用组件或无组件上传技术,均可以实现文件的上传功能。由此我们可以采用ASP的无组件上传技术,在我们自己的网站上建立一个虚拟的FTP服务器, 象真正的FTP服务器一样,为多个用户提供远程文件的管理 ,同时各个用户只能操作自己的文件。 当文件上传的时候,ASP可以采用FSO或数据库方式来保存文件数据(有些服务器并没...
Sockets是在Unix系统上提出来的,一开始主要是用于本地通讯,但很快就应用到C/S体系上。MicroSoft公司在此基础上创建了WinSock控件,专门用于Windows接口,与Sockets完全兼容。Winsock控件对用户来说是不可见的,它提供了访问 TCP 和 UDP 网络服务的方便途径。Microsoft Access、Visual Basic、Visual C++ 或 Visual FoxPro 的开发人员都可...
标签: 服务器
云服务器SLB初次使用   SLB是Server Load Balancer(负载均衡)的简称,是阿里云计算提供的一种网络负载均衡服务。SLB服务通过设置虚拟服务地址(IP),将位于同一机房(Region)的多台云服务器资源虚拟成一个高性能、高可用的应用服务池;再根据应用指定的方式,将来自客户端的网络请求分发到云服务池中。 SLB服务针对阿里云弹性计算...
标签: PHP
转自:http://www.webdn.com/web_file/program/php/0602080309/ 【摘 要】 本文将演示如何使用PHP连接一个LDAP服务器。具体的例子是连接到一个公共的LDAP服务器并且进行搜索。这个例子模拟的是Netscape Communicator 4.*,通过自己的地址本连接到LDAP资源。   本文将演示如何使用PHP连接一个LDAP服务器。具体的例子是...
标签: 服务器
如何停止云服务器   停止:该操作主要用来停止运行中状态的云服务器,即:只有当云服务器的状态为运行中时,上面的操作按钮才会显示,用来停止您的云服务器。如:绿色框为操作按钮。

经验教程

125

收藏

13
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部