c#實現web伺服器
www.itonline.gd.cn
這只是乙個簡單的用c#寫的web伺服器,只實現了get方式的對html檔案的請求,有興趣的朋友可以在此基礎之上繼續開發更多功能,小弟學c#不久,如有錯漏,望請見涼!!摘要:www的工作基於客戶機/伺服器計算模型,由web瀏覽器(客戶機)和web伺服器(伺服器)構成,兩者之間採用超文字傳送協議(http)進行通訊,http協議的作用原理包括四個步驟:連線,請求,應答。根據上述http協議的作用原理,本文實現了get請求的web伺服器程式的方法,通過建立tcplistener類物件,監聽埠8080;等待、接受客戶機連線到埠8080;建立與socket字相關聯的輸入流和輸出流;然後,讀取客戶機的請求資訊,若請求型別是get,則從請求資訊中獲取所訪問的html檔名,如果html檔案存在,則開啟html檔案,把http頭資訊和html檔案內容通過socket傳回給web瀏覽器,然後關閉檔案。否則傳送錯誤資訊給web瀏覽器。最後,關閉與相應web瀏覽器連線的socket字。
一、http協議的作用原理
www是以internet作為傳輸媒介的乙個應用系統,www網上最基本的傳輸單位是web網頁。www的工作基於客戶機/伺服器計算模型,由web瀏覽器(客戶機)和web伺服器(伺服器)構成,兩者之間採用超文字傳送協議(http)進行通訊。http協議是基於tcp/ip協議之上的協議,是web瀏覽器和web伺服器之間的應用層協議,是通用的、無狀態的、物件導向的協議。http協議的作用原理包括四個步驟:
連線:web瀏覽器與web伺服器建立連線,開啟乙個稱為socket(套接字)的虛擬檔案,此檔案的建立標誌著連線建立成功。
請求:web瀏覽器通過socket向web伺服器提交請求。http的請求一般是get或post命令(post用於form引數的傳遞)。get命令的格式為:
get路徑/檔名http/1.0
檔名指出所訪問的檔案,http/1.0指出web瀏覽器使用的http版本。
應答:web瀏覽器提交請求後,通過http協議傳送給web伺服器。web伺服器接到後,進行事務處理,處理結果又通過http傳回給web瀏覽器,從而在web瀏覽器上顯示出所請求的頁面。
例:假設客戶機與www.mycomputer.com:8080/mydir/index.html建立了連線,就會傳送get命令:get/mydir/index.htmlhttp/1.0。主機名為www.mycomputer.com的web伺服器從它的文件空間中搜尋子目錄mydir的檔案index.html。如果找到該檔案,web伺服器把該檔案內容傳送給相應的web瀏覽器。
為了告知web瀏覽器傳送內容的型別,web伺服器首先傳送一些http頭資訊,然後傳送具體內容(即http體資訊),http頭資訊和http體資訊之間用乙個空行分開。
常用的http頭資訊有:
這是web伺服器應答的第一行,列出伺服器正在執行的http版本號和應答**。**「200ok」表示請求完成。
②mime_version:1.0
它指示mime型別的版本。
③content_type:型別
這個頭資訊非常重要,它指示http體資訊的mime型別。如:content_type:text/html指示傳送的資料是html文件。
④content_length:長度值
它指示http體資訊的長度(位元組)。
關閉連線:當應答結束後,web瀏覽器與web伺服器必須斷開,以保證其它web瀏覽器能夠與web伺服器建立連線。
二、c#實現web伺服器功能的程式設計
根據上述http協議的作用原理,實現get請求的web伺服器程式的方法如下:
建立tcplistener類物件,監聽某埠(任意輸入閒置埠如:8080)。
等待、接受客戶機連線到該埠,得到與客戶機連線的socket;
從與socket關聯的輸入流中讀取一行客戶機提交的請求資訊,請求資訊的格式為:get路徑/檔名http/1.0
從請求資訊中獲取請求型別。如果請求型別是get,則從請求資訊中獲取所訪問的html檔名。沒有html檔名時,則以index.html作為檔名;
如果html檔案存在,則開啟html檔案,把http頭資訊和html檔案內容通過socket傳回給web瀏覽器,然後關閉檔案。否則傳送錯誤資訊給web瀏覽器;
關閉與相應web瀏覽器連線的socket字。
實現的**如下:
console.writeline("連線失敗....");
}catch(exceptione)
",e);}}
publicstaticvoidmain()
publicvoidstartlisten()
\n",mysocket.remoteendpoint);
bytebreceive=newbyte[1024];
inti=mysocket.receive(breceive,breceive.length,0);
//轉換成字串型別
stringsbuffer=encoding.ascii.getstring(breceive);
//只處理"get"請求型別
if(sbuffer.substring(0,3)!="get")
//查詢"http"的位置
//得到請求型別和檔案目錄檔名
srequest=sbuffer.substring(0,istartpos-1);
srequest.replace("\\","/");
//如果結尾不是檔名也不是以"/"結尾則加"/"
if((srequest.indexof(".")<1)&&(!srequest.endswith("/")))
//得帶請求檔名
istartpos=srequest.lastindexof("/")+1;
srequestedfile=srequest.substring(istartpos);
//得到請求檔案目錄
sdirname=srequest.substring(srequest.indexof("/"),srequest.lastindexof("/")-3);
//獲取虛擬目錄物理路徑
slocaldir=smywebserverroot;
console.writeline("請求檔案目錄:"+slocaldir);
if(slocaldir.length==0)
if(srequestedfile.length==0)
///取得請求檔案型別(設定為text/html)
/stringsmimetype="text/html";
sphysicalfilepath=slocaldir+srequestedfile;
console.writeline("請求檔案:"+sphysicalfilepath);
}}///結束
將檔案編譯成exe檔案,就實現了簡單的web伺服器功能!
可以設定乙個虛擬目錄,進行測試!
asp.net提供承載asp.net的方法。詳細可以看這個例子:
C 實現WEB伺服器
www的工作基於客戶機 伺服器計算模型,由web 瀏覽器 客戶機 和web伺服器 伺服器 構成,兩者之間採用超文字傳送協議 http 進行通訊,http協議的作用原理包括四個步驟 連線,請求,應答。根據上述http協議的作用原理,本文實現了get請求的web伺服器程式的方法,通過建立tcpliste...
c 實現Web伺服器
學習c 時,經常會遇到web伺服器功能的程式設計問題,這裡將介紹c 實現web伺服器功能的程式設計問題的解決方法。c 實現web伺服器功能的程式設計 根據http協議的作用原理,實現get請求的web伺服器程式的方法如下 建立tcplistener類物件,監聽某埠 任意輸入閒置埠 如 8080 等待...
C 實現WEB伺服器
www的工作基於客戶機 伺服器計算模型,由web 瀏覽器 客戶機 和web伺服器 伺服器 構成,兩者之間採用超文字傳送協議 http 進行通訊,http協議的作用原理包括四個步驟 連線,請求,應答。根據上述http協議的作用原理,本文實現了get請求的web伺服器程式的方法,通過建立tcpliste...