C#-JudgeSystem判題系統-一個簡單的HTTPServer

在原來的HTTPServer項目解決方案中添加新的控制檯SocketServer項目chrome

1

添加新的項目後能夠看到解決方案中有兩個項目編程

Unnamed QQ Screenshot20150729194308

創建好項目後咱們能夠進行編程c#

進行編程前咱們須要瞭解c# socket編程以及http的規範瀏覽器

1.socket編程服務器

d000baa1cd11728b45647b06cafcc3cec3fd2c4c

首先咱們決定使用tcp協議,拿到一張socket的tcp鏈接過程多線程

第一個創建一個c# socket套接字對象:異步

Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);socket

其中對象構造函數須要傳入三個對象用於創建合適的socket鏈接tcp

AddressFamily.InterNetwork表明使用ipv4協議函數

SocketType.Stream基於流

ProtocolType.Tcp協議爲TCP

創建socket對象後咱們須要綁定ip和端口:

ip使用0.0.0.0做爲監聽端口

port使用7777做爲監聽端口

IPEndPoint ipe = new IPEndPoint(IPAddress.Parse("0.0.0.0"), 7777);

第三步是註冊監聽端口:

s.Listen(0);

第四步是進入接受狀態:

Socket temp = s.Accept();

此時程序阻塞等待客戶端鏈接

鏈接成功程序才能繼續執行

Unnamed QQ Screenshot20150730162150

目前處理好socket的創建與鏈接,咱們測試一下代碼是否能正確鏈接再進行讀寫的操做,經過右側項目設置爲啓動項目

2

程序運行

Unnamed QQ Screenshot20150730162215

咱們看到系統監聽着0.0.0.0:7777

因爲瀏覽器充當客戶端的角色,咱們只須要再瀏覽器中訪問127.0.0.1:7777

 

Unnamed QQ Screenshot20150730162324

此時咱們可能看到瀏覽器經過端口16201與服務器鏈接,因爲沒有讀寫請求,因爲瀏覽器會一直停留在鏈接狀態等待超時

肯定程序能正常運行咱們再繼續編碼讀寫部分

一旦鏈接成功後咱們能夠經過鏈接成功的套接字temp這個對象來讀取寫

接收temp.Receive(buf, buf.Length, SocketFlags.None);

發送temp.Send(buf, buf.Length, SocketFlags.None);

其中須要先創建byte[] buf = new byte[1024];一個buf來存儲

而後能夠讀寫操做

讀出來的buf能夠經過Encoding.ASCII.GetString(buf, 0, bytes);轉換成字符串來顯示

Unnamed QQ Screenshot20150730164753

咱們先讀取到buf,轉換成string對象顯示到控制檯,再從控制檯讀取一行發送到遠端,最後關閉鏈接,關閉監聽

測試運行

Unnamed QQ Screenshot20150730164930

瀏覽器發送http請求數據輸入到服務器

而後咱們寫入一行

Unnamed QQ Screenshot20150730165044

回車

Unnamed QQ Screenshot20150730165110

瀏覽器顯示hello world

雖然使用並不符合http規範的響應也能夠被部分瀏覽器顯示,但爲了達到更規範的http服務器,咱們須要寫上相應的響應頭

buf = Encoding.ASCII.GetBytes("HTTP/1.1 200 OK\r\nServer: HTTPServer\r\n\r\n<h1>" + Console.ReadLine().ToString()+"</h1>");

不一樣的相應具備不一樣的響應頭,這裏不仔細研究更多的狀況

Unnamed QQ Screenshot20150730170314

最後咱們能夠經過chrome的開發者工具看到相關的相應信息,包括服務器與返回的狀態碼,也能正確讀取具體的內容

經過此次實驗掌握了socket的單線程編程,對於tcp鏈接的幾個步驟也有更深入的理解,對http的規範也有相應的掌握,在多線程與異步的處理上仍有待學習提升

相關文章
相關標籤/搜索