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(); }
一個也會可能會有多次請求。