最簡單的Web服務器


本案例中應用到得一些類和方法先一一列出來

1.IPAddress類用來表示一個IP地址

  1.1 IPAddress.Parse("192.168.43.104") 將一串ip地址字符串轉換為IP地址
  1.2 IPAddress.Loopback  獲得本機回環地址 即:127.0.0.1

2.IPEndPoint類(端點) 說白了就是ip地址和端口的組合(IP:Point) 他能唯一確定網絡中的一台電腦的某一個應用程序

  IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("192.168.43.104"), 8080); //創建了一個ip地址為192.168.43.104端口號位8080的網絡端點

    2.1.1 Address 獲取或設置終結點的 IP 地址   ex:endPoint.Address  //192.168.43.104
    2.1.2 AddressFamily 獲得網絡協議              ex:endPoint.AddressFamily  //http
    2.1.3 AddressPoint   獲得端口號信息          ex:endPoint.Point   //8080

3.Socket類    位於System.Net.Socket命名空間中    其封裝了Socket(套接字)的操作。

  3.1 Listen 設置基於連接通信的socket進入監聽狀態,並設置等待隊列的長度。  ex:socket.Listen(10)  //只允許10個客戶端同時發生請求
  3.2 Accept 等待一個新的連接,當新的連接到達的時候,返回一個針對新連接的Socket對象。即每個建立連接的客戶端都對應有一個Socket對象在服務器端,客戶端通過這個對象就可以和服務端進行連接通信了。    ex:   Socket client = socket.Accept();
  3.3 Receive 通過Socket接受字節數據,保存到一個字節數據中,返回一個int型的數據(實際接收的字節數)。
    ex://新建一個緩沖區
                byte[] buffer = new byte[2048];
                //接受數據
                int length = client.Receive(buffer,buffer.Length,SocketFlags.None);
  3.4 Send 故名思議 就是發送數據吧 沒錯  send通過Socket發送預先保存在字節數組中的數據。

下面是完整的事例代碼:

 

//----------------------------------------------------------------------------------------
            IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("192.168.43.104"), 8080);
            //創建socket,使用ipv4地址,傳輸協議為tcp,雙向、可靠、基於連接的字節流
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //將其綁定到一個端點上
            socket.Bind(endPoint);
            //設置連接隊列的長度
            socket.Listen(10);
            Console.WriteLine("開始監聽,端口號:{0}",endPoint.Port);
            while (true)
            { 
                //開始監聽。這個方法阻塞線程執行,直到接受到一個客戶端的連接請求
                Socket client = socket.Accept();
                //輸出客戶端地址
                Console.WriteLine("客戶端地址:{0}",client.RemoteEndPoint);
                //新建一個緩沖區
                byte[] buffer = new byte[2048];
                //接受數據
                int length = client.Receive(buffer,buffer.Length,SocketFlags.None);
                //將請求的數據轉換為utf-8
                //Encoding utf8 = Encoding.UTF8;
                string requestString = Encoding.UTF8.GetString(buffer, 0, length);
                //顯示請求的消息
                Console.WriteLine(requestString);

                //回應的狀態行
                string statusLine = "HTTP/1.1 200 OK\r\n";
                byte[] statusLineBytes = Encoding.UTF8.GetBytes(statusLine);
                //准備發送到客戶端的網頁
                string responseBody = "<html><head><title>hello world</title></head><body><h2>Hello World</h2></body></html>";
                byte[] responseBodyBytes = Encoding.UTF8.GetBytes(responseBody);
                //回應的頭部
                string responseHeader = string.Format("Content-type:text/html;charset=UTF-8\r\nContent-Length:{0}\r\n", responseBody.Length);
                byte[] responseHeaderBytes = Encoding.UTF8.GetBytes(responseHeader);
                client.Send(statusLineBytes);   //發送狀態信息
                client.Send(responseHeaderBytes);  //發送回應頭
                client.Send(new byte[] { 13, 10 }); //頭部與內容的分割行
                client.Send(responseBodyBytes);   //發送內容部分

                client.Close();   //斷開與客戶端的連接

                if (Console.KeyAvailable)
                    break;    //跳出死循環
                
            }
            //關閉服務器
            socket.Close();

 

因為http協議是無狀態連接,所以每完成一次或多次請求服務器會自動與客戶端斷開連接,保持服務器的資源

運行結果:

 

 

本文源代碼點擊下載  想運行一下結果的童鞋可以參考下哈


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM