程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 服務器端的高性能實現(三)——框架結構的初步調整

服務器端的高性能實現(三)——框架結構的初步調整

編輯:.NET實例教程

在上次,我完成了一個非常簡單的小框架。為了後面的開發,現在是對這個框架做些調整的時候了。

首先是配置信息的調整。比如IP和端口,這些東西當然不能寫死在代碼裡面了。為此,先在項目裡面建立一個文件夾,起名Config。顧名思義,這裡面的東西將來都會是配置相關的代碼。

這次先在裡面添加3個文件。

第一個叫做ConfigProvider,它的作用是對外提供配置信息。這一次,就讓它提供IP地址和端口。將來還會提供更多的內容,比如線程池的配置參數。理所當然的,ConfigProvider當然也是單件模式了。不過我要在它的構造函數裡面加點東西:
private string ipAddr;
private int portNum;
private ConfigProvider()
{
Init();
}
我在構造函數裡面添加了一個Init方法,它的作用是解析配置文件。配置文件我打算用.Net提供的配置文件,就是那個擴展名是.config的XML文件。下面是Init的實現代碼。
private void Init()
{
//UserProperty是我定義的一個節點名稱
CustomSection sec = (CustomSection)ConfigurationManager.GetSection("UserProperty");
CustomElement custElem = sec.CustElem;
this.ipAddr = custElem.IP;//IP地址
this.portNum = custElem.Port;//端口號
}

好了,ConfigProvider實現好了。很簡單吧,也很容易看明白。接下來是裡面用到的CustomSection和CustomElement。
先說CustomSection。看名字也很容易理解它的用處了,它表示配置文件裡面的一節。實現代碼就聊聊幾行,如下:
class CustomSection : ConfigurationSection
{
[ConfigurationProperty("CustomProperty")]
public CustomElement CustElem
{
get{return (CustomElement)this["CustomProperty"];}
}
}
完了。就這麼幾行。
接下來是CustomElement了。
class CustomElement : ConfigurationElement
{
[ConfigurationProperty("IP")]
{
get{return (string)this["IP"];}
}

[ConfigurationProperty("Port")]
{
get{return (string)this["Port"];}
}
}
再下來是配置文件裡面的內容:
.....




IP="192.168.14.13"
Port="9527"/>


好了,接下來該調整框架結構了。首先建立一個文件夾Core,然後把最早建立的Core放進去。接著,先添加一個Listener類。把Core裡面的start和stop轉移到這裡面來。這樣做的目的是專門建立一個用於監聽網絡的類,做到條例清晰。

下面建立一個ConnectionManager類。還記得先前Core裡面用一個ArrayList保存socket的做法麼?其實這個ConnectionManager,就是一個高級些的ArrayList。在文件夾Core下面添加ConnectionManager類,然後停下來思考一下先。這個ConnectionManager都要提供什麼方法呢?肯定要有添加socket,刪除socket,將來還會有遍歷socket的功能。好了,就先實現剛才說的那兩個方法。代碼如下:
private ArrayList allsockets = new ArrayList();
public void AddSocket(TcpClient clIEnt)
{
if (client != null && !allsockets.Contains(clIEnt))
{
allsockets.Add(clIEnt);
}
}

public void RemoveAllSockets()
{
try
{
foreach(TcpClient clIEnt in allsockets)
{
clIEnt.GetStream().Closer();
clIEnt.Close();
}
Clear();
}
catch{}
}

public void Clear()
{
allsockets.Clear();
}
上面的三個方法,分別提供了保存socket,關閉全部socket和清空socket的功能。做完這些之後,我們的工作還沒有結束。接著是添加一個接口:IConnection。目前,這個接口就3個方法,就是上面那3個,呵呵。然後修改類ConnectionManager的聲明,讓它繼承這個接口。

可能有人會問了:干什麼要這麼做呢?
理由很多,但是一條就足夠了:為了測試!

現在做好了ConnectionManager,接下來就要回過頭來修改一下Listener了。沒錯,我也要給它的接口提取出來。不過提取之前,還要改點東西。
首先就是把以前Listener裡面用到allsockets的地方,都改用ConnectionManager來做。
然後,把對ConnectionManager的聲明使用這樣修改:
不要寫private ConnectionManager connection = new ConnectionManager();
而是要寫private IConnection connection;
為了給connection賦值,我又添加了一個屬性:
public IConnection Connection
{
get{return this.connection;}
set{this.connection = (IConnection)value;}
}
接下來,提取接口,我添加了一個IListener接口,如下:
interface IListener
{
void Start();
void Stop();
IConnection Connection{set;get;}
}
最後,就是修改Listener的聲明了,讓它繼承IListener。

這些都做完了,剩下的就是修改Core這個最早做好的類了。可以說,現在的它才是真正的實現了當領導的願望,不用再自己去干活了。
現在的core裡面的start和stop方法實現如下:
public void Start()
{
listener.Start();
}

public void Stop()
{
listener.Stop();
}
此外,Core也逃脫不了被提取接口的命運。它的接口也很簡單,就是上面那兩個方法,接口的名字自然就叫做ICore了,呵呵。

完成了這些,還有一件事情沒有做。就是給Listener設置Connection。為此,我在Core的構造函數裡面添加了一個Init方法。Init的代碼如下:
private IListener listener;
private void Init()
{
if(listerner == null)
listener = new Listener();
listener.Connection = new ConnectionManager();
}

不過,上面有一行代碼的實現還可以做得更好,就是這行:
listener.Connection = new ConnectionManager();

既然都接口了,又有了上面配置文件的基礎,嘿嘿,反射一下好了。利用配置文件,來決定我們用哪個ConnectionManager(雖然就一個吧,而且似乎也沒有變動的必要)。可是為什麼要這麼做呢?很簡單:靈活,另外就是———多學習點技術總不是壞事情吧,嘿嘿。

於是,仿照上面在配置文件裡面添加IP和Port的過程,添加一個Connection屬性,類型還是字符串就可以了。
我這裡的配置文件就變成了下面的樣子:

IP="192.168.14.13"
Port="9527"
Connection ="Server4Win.Core.ConnectionManager"/>

至於修改CustomXX類的過程我就跳過了。
下面修改Core裡面的Init。
private void Init()
{
if(listerner == null)
listener = new Listener();
connection = (IConnection)Activator.CreateInstance(Type.GetType(ConfigProvider.GetInstance.Connection));
if (connection == null)
{
throw new TypeLoadException("cann''t find this type");
}


else
{
listener.Connection = connection;
}
}

如此一來,以後要是換個Connection,直接改配置文件就可以了。

框架結構的調整到這裡先告一段落。接下來就要進入真正的正題了:如何響應客戶端的信息。

這個東西,下次寫!嘿嘿。

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