.net core Socket


Socket是什么

 

 

實際上socket是對TCP/IP協議的封裝,它的出現只是使得程序員更方便地使用TCP/IP協議棧而已。socket本身並不是協議,它是應用層與TCP/IP協議族通信的中間軟件抽象層,是一組調用接口(TCP/IP網絡的API函數)。更加方便程序員使用傳輸層

TCP/IP只是一個協議棧,就像操作系統的運行機制一樣,必須要具體實現,同時還要提供對外的操作接口。
這個就像操作系統會提供標准的編程接口,比如win32編程接口一樣。
TCP/IP也要提供可供程序員做網絡開發所用的接口,這就是Socket編程接口。”

HTTP是轎車,提供了封裝或者顯示數據的具體形式;。
Socket是發動機,提供了網絡通信的能力。

實際上,傳輸層的TCP是基於網絡層的IP協議的,而應用層的HTTP協議又是基於傳輸層的TCP協議的,而Socket本身不算是協議,就像上面所說,它只是提供了一個針對TCP或者UDP編程的接口。

https://blog.csdn.net/github_34606293/article/details/78230456

 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

應用層  http/https

  http作用,  解決了一個數據包裝的問題

  http報文  request報文  response報文   報文都是嚴格的格式約束

傳輸層   socket(tcp/ip協議)  tcp  udp

  解決了數據如何在網絡中傳輸的問題。。 (面向連接還是非連接的)

網絡層 ip

 

socket服務器

 

 

 

 

 

 

//AddressFamily 地址類型。采用IP4
//SocketType  傳輸數據類型
//ProtocolType 協議類型
static Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

public static void Start()
{
    socket.Bind(new IPEndPoint(IPAddress.Any, 8002));

    socket.Listen(100);

    //接收客戶端的 Socket請求   第一個參數是一個委托,第二個參數是第一個參數的參數
    socket.BeginAccept(OnAccept, socket);

    Console.WriteLine("當前web服務器啟動成功,端口號為:8002");
}
        public static void OnAccept(IAsyncResult ar)
        {
            var serverSocket = ar.AsyncState as Socket;

            //客戶端socket
            var clientSocket = serverSocket.EndAccept(ar);

            //服務端進行下一步監聽
            serverSocket.BeginAccept(OnAccept, serverSocket);


            var bytes = new byte[1000];
            //獲取客戶端socket內容
            var len = clientSocket.Receive(bytes);
            //轉化正字符串
            var request = Encoding.UTF8.GetString(bytes, 0, len);


            var response = string.Empty;

            if (!string.IsNullOrEmpty(request) && !request.Contains("favicon.ico"))
            {
                // /1.html
                var filePath = request.Split("\r\n")[0].Split(" ")[1].TrimStart('/');

                //獲取文件內容
                response = System.IO.File.ReadAllText(filePath, Encoding.UTF8);
            }

            Console.WriteLine(request+"標識執行了");

            //按照http的響應報文返回
            var responseHeader = string.Format(@"HTTP/1.1 200 OK
Date: Sun, 26 Aug 2018 03:33:36 GMT
Server: nginx
Content-Type: text/html; charset=utf-8
Cache-Control: no-cache
Pragma: no-cache
Via: hngd_ax63.139
X-Via: 1.1 tjhtapp63.147:3800, 1.1 cbsshdf-A4-2-D-14.32:8101
Connection: keep-alive
Content-Length: {0}

", Encoding.UTF8.GetByteCount(response));

            //返回給客戶端了 可以多次返回
            clientSocket.Send(Encoding.UTF8.GetBytes(responseHeader));
            clientSocket.Send(Encoding.UTF8.GetBytes(response));

            clientSocket.Close();

        }

 

一個也會可能會有多次請求。

 下載代碼


免責聲明!

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



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