第一個SignalR案例


    說明:開發的案例為Hub(集線器)

一、開發環境 

  VS2013  ,window10

二、步驟

  打開vs創建一個新的解決方案,添加一個空的WebForm項目。

  使用NuGet添加引用。命令:PM>  instal-package Microsoft.AspNet.SignalR 或者 工具->NuGet程序包管理器->管理解決方案的NuGet程序包,里搜索和添加

三、添加Default.aspx頁面

  頁面中首先引用jquery 1.6.4 及以上版本庫

  添加引用jquery.signalR-2.2.1.min.js 庫

  添加script引用 /signalr/js   

  以上為引用為必須,並且順序不可調整, /signalr/js 依賴與jquery.signalR-2.2.1.min.js庫,並且是動態生成的(即:不存在該文件)

  Default.aspx頁面的html代碼如下:

  

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Drawing board</title>
    <script src="Scripts/jquery-1.6.4.min.js"></script>
    <script src="Scripts/jquery.signalR-2.2.1.min.js"></script>
    <script src="/signalr/js"></script>
    <script src="Scripts/DrawingBoard.js"></script>
    <style>
        div {
            margin: 3px;
        }

        canvas {
            border: 2px solid #808080;
            cursor: default;
        }
    </style>
</head>
<body>
    <div>
        <div>
            <label for="color">Color: </label>
            <select id="color">
            </select>
        </div>
        <canvas id="canvas" width="300" height="300"></canvas>
        <div>
            <button id="clear">Clear canvas</button>
        </div>
    </div>
</body>
</html>

  頁面實現功能描述:實現簡單畫板的多個頁面同步功能。

  代碼中 #canvas為畫板所用標簽  ,#color 為畫筆顏色選項,#clear為清除畫板的按鈕

   Scripts/DrawingBoard.js  代碼為Hub客戶端必要的邏輯。代碼如下:

  

$(function () {

    ///////////////////////////////////////////////////////////////
    // Standard drawing board functionalities
    ///////////////////////////////////////////////////////////////

    var colors = ["black", "red", "green", "blue", "yellow", "magenta", "white"];
    var canvas = $("#canvas");
    var colorElement = $("#color");
    for (var i = 0; i < colors.length; i++) {
        colorElement.append(
            "<option value='" + (i + 1) + "'>" + colors[i] + "</li>"
        );
    }
    var buttonPressed = false;
    canvas
        .mousedown(function () {
            buttonPressed = true;
        })
        .mouseup(function () {
            buttonPressed = false;
        })
        .mousemove(function (e) {
            if (buttonPressed) {
                setPoint(e.offsetX, e.offsetY, colorElement.val());
            }
        });

    var ctx = canvas[0].getContext("2d");
    function setPoint(x, y, color) {
        ctx.fillStyle = colors[color-1];
        ctx.beginPath();
        ctx.arc(x, y, 2, 0, Math.PI * 2);
        ctx.fill();
    }
    function clearPoints() {
        ctx.clearRect(0, 0, canvas.width(), canvas.height());
    }

    $("#clear").click(function () {
        clearPoints();
    });

    ///////////////////////////////////////////////////////////////
    // SignalR specific code
    ///////////////////////////////////////////////////////////////

    var hub = $.connection.drawingBoard;
    hub.state.color = colorElement.val(); // Accessible from server
    var connected = false;

    // UI events
    colorElement.change(function () {
        hub.state.color = $(this).val();
    });
    canvas.mousemove(function (e) {
        if (buttonPressed && connected) {
            hub.server.broadcastPoint(
                Math.round(e.offsetX), Math.round(e.offsetY)
            );
        }
    });
    $("#clear").click(function () {
        if (connected) {
            hub.server.broadcastClear();
        }
    });

    // Event handlers
    hub.client.clear = function () {
        clearPoints();
    };
    hub.client.drawPoint = function (x, y, color) {
        setPoint(x, y, color);
    };
    hub.client.update = function (points) {
        if (!points) return;
        for (var x = 0; x < 300; x++) {
            for (var y = 0; y < 300; y++) {
                if (points[x][y]) {
                    setPoint(x, y, points[x][y]);
                }
            }
        }
    };

    // Voila!
    $.connection.hub.start()
        .done(function () {
            connected = true;
        });

});

  js中關於本文核心代碼表述:

   var hub = $.connection.drawingBoard;  固定寫法,創建集線器代理工具(此處只能意會)

   hub.state.color = colorElement.val(); //   畫筆顏色參數,類似於url傳遞querystring 參數,可查看下文中C#代碼理解

   var connected = false;  //狀態標志

   hub.state.color = $(this).val(); //設置參數值,同上文

   hub.server.broadcastPoint(Math.round(e.offsetX), Math.round(e.offsetY));  //調用服務器端的服務方法  BroadcastPoint  ,在花瓣上打印一個點

  注解:服務端的方法在web端調取時候需要第一個字幕小寫開頭,詳情請自行百度

   hub.server.broadcastClear();  //調用服務端清空畫板服務方法

   hub.client.clear = function () {

    clearPoints();   //客戶端清除
   };

   hub.client.drawPoint

   hub.client.update   

    注解:以上兩條請參考上文中解釋

   $.connection.hub.start()    //開始建立鏈接

    .done(function () {  //暫忘記了
      connected = true;
    });

四、添加啟動類

  根目錄下添加  Startup.cs文件,代碼如下:

  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Owin;

namespace Test
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.MapSignalR();
        }
    }
}

  注解: app.MapSignalR();用於注冊默認服務

五、添加Hub服務

  根目錄下添加DrawingBoard.cs  代碼如下:

  

using System.Threading.Tasks;
using Microsoft.AspNet.SignalR;

namespace DrawingBoard
{
    public class DrawingBoard : Hub
    {
        private const int BoardWidth = 300, BoardHeight = 300;
        private static int[,] _buffer = GetEmptyBuffer();
        public Task BroadcastPoint(int x, int y)
        {
            if (x < 0) x = 0;
            if (x >= BoardWidth) x = BoardWidth - 1;
            if (y < 0) y = 0;
            if (y >= BoardHeight) y = BoardHeight - 1;

            int color = 0;
            int.TryParse(Clients.Caller.color, out color);
            _buffer[x, y] = color;
            return Clients.Others.DrawPoint(x, y, Clients.Caller.color);
        }
        public Task BroadcastClear()
        {
            _buffer = GetEmptyBuffer();
            return Clients.Others.Clear();
        }

        public override Task OnConnected()
        {
            return Clients.Caller.Update(_buffer);
        }

        private static int[,] GetEmptyBuffer()
        {
            var buffer = new int[BoardWidth, BoardHeight];
            return buffer;
        }
    }
}

  邏輯並不復雜,就是轉發客戶端傳遞進來的數據給其他客戶端,請自行理解。

 

 

開發中遇到的問題:

  配置錯誤,開始時候使用web.config配置,發現報錯了具體錯誤已經丟失,發現是 Startup  配置錯誤,Startup.cs可以立即為默認的必須的存在的。推測可以使用web.config配置為其他啟動類,但是未測試。

  具體請關注后續文章。

運行效果圖:

  

  

請注意:本文中代碼摘自ASP.NET  SignalR 編程實踐一書 豆瓣鏈接:https://book.douban.com/subject/26378222/


免責聲明!

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



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