1、什么是WebSocket
WebSocket使得客戶端和服務器之間的數據交換變得更加簡單,允許服務端主動向客戶端推送數據。在WebSocket API中,瀏覽器和服務器只需要完成一次握手,兩者之間就直接可以創建持久性的連接,並進行雙向數據傳輸。
2、WebSocket和Socket區別
①、原理上的區別:
Socket是傳輸控制層協議,WebSocket是應用層協議。
Socket是應用層與2113TCP/IP協議族通信的中間軟件抽象層,它是一組接口(不是協議,為了方便使用TCP或UDP而抽象出來的一層,是位於應用層和傳輸控制層之間的
一組接口)。
在設計模式中,Socket其實就是一個門面模式,它把復雜的TCP/IP協議族隱藏在Socket接口后面。利用TCP/IP協議建立TCP連接。(TCP連接則更依靠於底層的IP協議,
IP協議的連接則依賴於鏈路層等更低層次。)
WebSocket則是一個典型的應用層協議。
②、靈活運用的程度不同:
WebSocket 更易用,而 Socket 更靈活。Socket是應用層與TCP/IP協議族通信的中間軟件抽象層,它是一組接口。
在設計模式中,Socket其實就是一個門面模式,它把復雜的TCP/IP協議族隱藏在Socket接口后面,對用戶來說,一組簡單的接口就是全部,讓Socket去組織數據,以符合
指定的協議。
主機 A 的應用程序要能和主機 B 的應用程序通信,必須通過 Socket 建立連接,而建立 Socket 連接必須需要底層 TCP/IP 協議來建立 TCP 連接。建立 TCP 連接需要底層
IP 協議來尋址網絡中的主機。
網絡層使用5261的 IP 協議可以幫助我們根據 IP 地址來找到目標主機,但是一台主機上可能運行着多個應用程序,如何才能與指定的應用程序通信就要通過 TCP 或 UPD
的地址也就是端口號來指定。這樣就可以通過一個 Socket 實例唯一代表一個主機上的一個應用程序的通信鏈路了。
而 WebSocket 則不同,它4102是一個完整的 應用層協議,包含一套標准的 API 。
③、傳輸層次不同:
Socket 是傳輸控制層的接口。用戶可以通過 Socket 來操作底層 TCP/IP 協議族通信。
網絡中的 Socket 並不是什么協議,而是為了使用 TCP,UDP 而抽象出來的一層 API,它是位於應用層和傳輸層之間的一個抽象層。Socket 是對 TCP/IP 的封裝;HTTP 是
轎車,提供了封裝或者顯示數據的具體形式;Socket 是發動機,提供了網絡通信的能力。
在 Unix 一切皆文件哲學的思想下,Socket 是一種"打開—讀/寫—關閉"模式的實現,服務器和客戶端各自維護一個"文件",在建立連接打開后,可以向自己文件寫入內容供
對方讀取或者讀取對方內容,通訊結束時關閉文件。
WebSocket 是一種在單個 TCP 連接上進行全雙工通信的協議。WebSocket 使得客戶端和服務器之間的數據交換變得更加簡單,允許服務端主動向客戶端推送數據。
在 WebSocket API 中,1653瀏覽器和服務器只需要完成一次 HTTP 握手,兩者之間就直接可以創建持久性的連接,並進行雙向數據傳輸。
3、服務器代碼
static void Main(string[] args) { FleckLog.Level = LogLevel.Debug; var allSockets = new List<IWebSocketConnection>(); var server = new WebSocketServer("ws://0.0.0.0:7181"); server.Start(socket => { socket.OnOpen = () => { Console.WriteLine("Open!"); allSockets.Add(socket); }; socket.OnClose = () => // 當關閉Socket鏈接十執行此方法 { Console.WriteLine("Close!"); allSockets.Remove(socket); }; socket.OnMessage = message => // 接收客戶端發送過來的信息 { Console.WriteLine(message); allSockets.ToList().ForEach(s => s.Send("Echo: " + message)); }; }); var input = Console.ReadLine(); while (input != "exit") { foreach (var socket in allSockets.ToList()) { socket.Send(input); } input = Console.ReadLine(); } }
4、客戶端代碼
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> <script type="text/javascript"> var start = function () { var inc = document.getElementById('incomming'); var wsImpl = window.WebSocket || window.MozWebSocket; var submit = document.getElementById('submit'); var input = document.getElementById('sendText'); inc.innerHTML += "connecting to server ..<br/>"; // 創建新的websocket新連接端口為7181 window.ws = new wsImpl('ws://localhost:7181/'); // 當數據從服務器服務中心發送后,繼續向下運行過程 ws.onmessage = function (evt) { inc.innerHTML += evt.data + '<br/>'; }; // 當鏈接對象找到服務端成功對接后,提示正常打開 ws.onopen = function () { inc.innerHTML += '.. connection open<br/>'; }; // 當鏈接對象未找找到服務端成功對接后,提示打開失敗,別切單項關閉 ws.onclose = function () { inc.innerHTML += '.. connection closed<br/>'; } submit.onclick = function () { var val = input.value; ws.send(val); input.value = ""; }; } window.onload = start; </script> </head> <body> <div> <input id="sendText" placeholder="Text To Send" /><input type="button" id="submit" value="提交" /> </div> <pre id="incomming"></pre> </body> </html>