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

服務器端的高性能實現(二)——windows下的第一步實現

編輯:.NET實例教程
既然是Windows平台下的開發,就簡單隨個潮流,用VS2005好了,語言是c#。(其實是因為我熟悉這個,嘿嘿)

先開始搭建基本的框架吧。現在也沒有太多的設計思路,就先一步一步開始吧,也算是個經驗的積累。

首先創建一個類庫的項目,叫什麼呢?好的開始可是成功的一半啊,名字問題足足花了我5分鐘的時間——汗。最後起了個很俗的名字:Server4Win。顧名思義,就是Windows平台下的server。

好了,開始了。

先添加一個類,起名Core(好像也很俗哦)。然後就是給裡面加東西了。

不過,寫之前還是要先思考思考的。第一個問題就是這個類Core是干什麼用的。干什麼用呢?我給它安排的任務是對外提供server端的各種功能。而且考慮到一般server就一個,於是設計為單件模式。部分代碼如下:

private static Core _core;

private Core()
{}

public static Core GetInstance
{
get
{if (_core == null)
_core = new Core();
return _core;}
}

好了,現在單件的框架已經搭好了,下面就是其他功能的添加了。當然了,我還是本著先實現,再優化的思路,所以剛開始的實現可能問題很多。之所以這麼做,就是為了體會一下從無到有的過程,直接把現成的好東西拿來就用,我的消化能力可沒那麼好。

下面是我要給它添加兩個功能,start和stop。

start就是啟動服務。服務啟動之後,客戶端就可以與服務器建立連接了。stop當然就是停止服務了。

先說start吧。start裡面具體干什麼呢?簡單來說,就是建立一個監聽,等待客戶端的連接,一旦發現有連接請求,就創建一個socket接受這個連接請求,然後繼續監聽。

start的第一次實現:
private TcpListener listener;
private string hostName = "192.168.14.13";//這個是我電腦的IP
private int portNumber = 9527;//9527??嘿嘿,很有趣的端口吧
private ArrayList allsockets = new ArrayList();//用於保存客戶端的連接
public void Start()
{
if (listener == null)
{
listener = new TcpListener(IPAddress.Parse(hostName),portNumber);
}
listener.Start();
while(true)
{
TcpClient client = listener.AcceptTcpClIEnt();
if (clIEnt != null)
allsockets.Add(clIEnt);
}
}

上面就是第一版的實現,就美名為V0.1吧。但是這個0.1裡面問題很多。
首先,當系統調用AcceptTcpClIEnt時會掛起,這會導致主線程失去響應,使服務器端永遠的“不作為”,想停都停不了。也就是說,如果沒有客戶端來“激活”一下話,我們就完蛋了!
於是,在這個背景下,V0.2橫空出世了。
重復的代碼我就不寫了。
public void Start()
{
if (listener == null)
{
listener = new TcpListener(IPAddress.Parse(hostName),portNumber);
}
listener.Start();
new Thread(new ThreadStart(ListenOnAccept)).Start();
}
private void ListenOnAccept()
{
while(true)
{
TcpClient client = listener.AcceptTcpClIEnt();
if (clIEnt != null)
allsockets.Add(clIEnt);
}
}

這回看起來就好了很多。在0.2,我們解決了主線程掛起的問題。可是,還有一個沒有解決。這個問題就是服務器端無法停止。因為只要一調用AcceptTcpClIEnt,人家服務器就不理咱們了。為了解決這個問題,於是又出現了V0.3。同時,為了保證在start之後,不會再又被start了,我還要給core添加一個start的標示。
private bool _start = false;//start標示。
public void Start()
{
if (!_start)
{
if (listener == null)
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved