現在網絡的流行
使得服務器程序得到了廣泛的應用
那麼我們使用Delphi如何設計出強壯的服務器呢?
有人說
如果要設計服務器的話
一定要使用VC來設計
其實這個人說的有一定道理
因為如果你要使用Delphi來設計服務器的話
要想設計高效的服務器就不要使用Delphi帶來的大部分的控件(最好不要使用Delphi控件)
為什麼呢?下面我會告訴大家
這樣的話你全部使用API來設計服務器
就同VC沒有太大的區別了
使用Delphi來設計服務器程序
具體選擇是使用窗體消息模式還是使用完成端口的模式
這主要看你的用戶連接數量來決定
如果你的用戶連接數量小於
人的話
並且處理的數據量不大的話
可以使用窗體的消息模式來進行服務器的開發
而如果大於
這樣最好使用完成端口來開發服務器
我這裡建議大家最好使用完成端口模式
因為你不可能保證你的用戶數量不變化
同時由於你的服務器如果運行一段時間沒有問題的話
最好做成WIN 的服務程序
這樣可以保證後期的維護比較少
現在介紹你在開發Delphi服務器的時候需要注意地方
不要在程序中使用String變量
這個也是在實際的開發過程中發現的
我最開始開發的時候
為了簡單一些
就大量使用String變量來開發程序
但程序總是在運行一段時間後出現問題
後來查原因也不太清楚
到網上查資料
發現有人介紹不要使用String來做變量
將自己的程序全部修改成數組問題就基本解決了
使用快速的加密算法如XOR 加密或DES加密等算法
服務器在與客戶端傳遞的時候一定要進行加密
但使用什麼類型的加密算法呢?不要使用那種需要大量運算的算法如RSA等算法
最好使用XOR加密或DES換位加密算法
這樣主要是滿足普通的加密密文的要求
又保證服務器的運算速度
你也可以使用RSA加密密文
但這會造成服務器處理變慢
而如果遇到大量的處理時候
很容易服務器就拒絕服務器
使用原ADO函數來連接數據庫
服務器程序通常都與數據庫想結合
那麼使用Delphi開發的時候
通常使用ADO的控件來制作
但如果你學習ADO手冊會發現
對於服務器其實不需要控件來完成數據的操作
可以直接使用ADO相應的函數來完成
主要因為服務器程序與數據庫通常都是比較簡單的操作
沒有很復雜的
所以使用原ADO模式就可以了
這樣也減少由於ADO控件帶來的問題
應多使用
池
服務器在設計的過程
一定要大量的變量支持
如果不使用池這個概念
你的程序將在創建和釋放變量過程中浪費大量的時間
而且容易出現問題
設計過程中盡量不要創建和釋放變量
如果能考慮到的變量
都在開始的運行的時候創建完畢
這樣可以加快程序的運行速度
減少沖突
具體如何使用池這個技術
以後有時間再考慮寫一篇介紹一下
熟練使用指針操作
如果你不熟悉指針操作
那麼你幾乎無法設計出高效的服務器
如果你要真正的理解指針的概念
對於設計服務器來說就是如虎添翼
下面舉個例子
如使用Recv接收數據到Buffer中後
你需要進行解密操作
你可以使用下面的方法進行
var
a
b:array [
] of byte;
i :integer;
ResultBuffer :array [
Max] of byte;
begin
for i :=
to Sizeof(Buffer) div
do
begin
move(Buffer[(i
)*
+
]
a
);
Des(a
b
true); //這裡使用DES加解密處理
move(b
ResultBuffer[(i
)*
+
]
);
end;
end
大家看一看
上面的代碼
思路很清楚
就是將接收到的Buffer分別按
個提到變量a中
再使用DES解密算法解密成b
再放回ResultBuffer中
如果你熟練使用指針的話
效率會極大的提高
var
a
b:Pbyte;
i :integer;
ResultBuffer :array [
Max] of byte;
begin
for i :=
to Sizeof(Buffer) div
do
begin
a := @Buffer[(i
)*
+
];
b := @ResultBuffer[(i
)*
+
]
Des(a^
b^
true); //這裡使用DES加解密處理
end;
end
再看一看上面的代碼
是不是少了兩個Copy數據的過程
這就是指針給你帶來的高效
多使用WSASend
WSARecv等WinSocket
函數
不要使用Send
Recv函數
這個主要看你的服務器運行在什麼系統中了
如果運行在WIN系統裡
最好使用WSA系統的函數
因為Microsoft畢竟將它們都優化了
合理使用線程池操作
高效的服務器一定要使用線程池技術
使用多少線程合理
需要線程處理什麼樣的數據
我個人認為如果要使用線程池的技術
一定要處理那些最費時的操作
如數據庫的查詢操作
如果服務器使用了
池
的概念
這就又出現了一個問題
如何高效的分配池呢?
我在程序中大量的使用池
如線程池
數據池等
當數據到達的時候
如何分配池呢?這裡就不告訴大家了
以後再專門寫一篇關於池的文章
詳細的介紹如何使用池
大家也可以自己考慮一下
使用高效的字符串操作函數
因為服務器一定要進行大量的字符串運行
如果使用Delphi自帶的函數來操作
就比較費時
所以這裡推薦大家使用QStrings
pas字符串操作函數集
相信會對大家有幫助的
優化你的SQL查詢語句
你可以一方面優化SQL查詢語句來提高運行效率
另一方面你還可以使用存儲過程來更大的提高運行效率
From:http://tw.wingwit.com/Article/program/Delphi/201311/24676.html