WebSocket in ASP.NET Core

1、WebSocket

  WebSocket是HTML5出的東西(協議),也就是說HTTP協議沒有變化,或者說不要緊,但HTTP是不支持持久鏈接的(長鏈接,循環鏈接的不算)javascript

首先HTTP有1.1和1.0之說,也就是所謂的keep-alive,把多個HTTP請求合併爲一個,可是Websocket實際上是一個新協議,跟HTTP協議基本沒有關係,只是爲了兼容現有瀏覽器的握手規範而已,也就是說它是HTTP協議上的一種補充。WS和WSS協議相似於HTTP和HTTPS,容許使用安全和保密的通訊方案。html

回到目錄java

2、ASP.NET Core中的WebSocket

  要在ASP.NET Core中使用WebSocket,要先引用Microsoft.AspNetCore.WebSockets.Server的NuGet Package包。git

  下面咱們建立一個名爲WebSocketHandler.cs的類,內容以下:github

  經過對HttpContext中的WebSockets.AcceptWebSocketAsync方法,接受WebSocket請求;並在EchoLoop函數中進行請求的處理。web

   
  1. public class SocketHandler瀏覽器

  2.    {安全

  3.        public const int BufferSize = 4096;微信

  4.        WebSocket socket;app

  5.        SocketHandler(WebSocket socket)

  6.        {

  7.            this.socket = socket;

  8.        }

  9.        async Task EchoLoop()

  10.        {

  11.            var buffer = new byte[BufferSize];

  12.            var seg = new ArraySegment<byte>(buffer);

  13.            while (this.socket.State == WebSocketState.Open)

  14.            {

  15.                var incoming = await this.socket.ReceiveAsync(seg, CancellationToken.None);

  16.                var outgoing = new ArraySegment<byte>(buffer, 0, incoming.Count);

  17.                await this.socket.SendAsync(outgoing, WebSocketMessageType.Text, true, CancellationToken.None);

  18.            }

  19.        }

  20.        static async Task Acceptor(HttpContext hc, Func<Task> n)

  21.        {

  22.            if (!hc.WebSockets.IsWebSocketRequest)

  23.                return;

  24.            var socket = await hc.WebSockets.AcceptWebSocketAsync();

  25.            var h = new SocketHandler(socket);

  26.            await h.EchoLoop();

  27.        }

  28.        /// <summary>

  29.        /// branches the request pipeline for this SocketHandler usage

  30.        /// </summary>

  31.        /// <param name="app"></param>

  32.        public static void Map(IApplicationBuilder app)

  33.        {

  34.            app.UseWebSockets();

  35.            app.Use(SocketHandler.Acceptor);

  36.        }

  37.    }

  這個類只處理了最簡單的客戶端發送信息並將原文返回客戶端。

  接着就要作路由映射了:

   
  1.  app.UseStaticFiles();

  2.  app.Map("/ws", SocketHandler.Map);

  要驗證並看到運行的結果,咱們還要建立一個Html。並在Html頁面裏面建立一個Div內容以下:

   
  1. <div id="output"></div>

  而且添加一個WebSocket的客戶端腳本:

 

   
  1. <script language="javascript" type="text/javascript">

  2. var socket;

  3. var uri = "ws://" + window.location.host + "/ws";

  4. var output;

  5. var text = "test echo";

  6. function write(s) {

  7.    var p = document.createElement("p");

  8.    p.innerHTML = s;

  9.    output.appendChild(p);

  10. }

  11. function doConnect() {

  12.    socket = new WebSocket(uri);

  13.    socket.onopen = function (e) { write("opened " + uri); doSend(); };

  14.    socket.onclose = function (e) { write("closed"); };

  15.    socket.onmessage = function (e) { write("Received: " + e.data); socket.close(); };

  16.    socket.onerror = function (e) { write("Error: " + e.data); };

  17. }

  18. function doSend() {

  19.    write("Sending: " + text);

  20.    socket.send(text);

  21. }

  22. function onInit() {

  23.    output = document.getElementById("output");

  24.    doConnect();

  25. }

  26. window.onload = onInit;

  27. </script>

 

  下面就能夠看到運行結果了:

 

 

  這個例子能夠在以下Github中獲取到:https://github.com/zbrad/wsweb

原文地址: http://www.cnblogs.com/maxzhang1985/p/6208165.html


.NET社區新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關注

本文分享自微信公衆號 - dotNET跨平臺(opendotnet)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索