C# WebSocket 及時通信協議


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>

 


免責聲明!

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



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