程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 如何使用Delphi設計強大的服務器程序

如何使用Delphi設計強大的服務器程序

編輯: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查詢語句來提高運行效率,另一方面你還可以使用存儲過程來更大的提高運行效率。(這些知識你需要看數據庫的內容,這裡具體如何優化就不說了。) 

  上面介紹是我的實踐經驗,不一定全對,希望大家能有幫助。如果有更好的方法,也可以討論。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved