一步一步学习SignalR进行实时通信_8_案例2
一步一步学习SignalR进行实时通信\_8_案例2
SignalR
前言
这讲分析一个案例,在一个画板上画画实时在其他客户端上显示。
配置Hub
在Startup中进行配置:
public void Configuration(IAppBuilder app){app.MapSignalR();}
建立DrawingHub
public class Drawing : Hub{private const int BoardWidth = 300, BoardHeight = 300;private static int[,] _buffer = new int[BoardWidth, BoardHeight];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 = new int[BoardWidth, BoardHeight];return Clients.Others.Clear();}public override Task OnConnected(){return Clients.Caller.Update(_buffer);}}
用一个二位数组来缓存画板,一共就三个方法
1. 当客户端连接时调用Update()方法刷新整个画板
2.BroadcastClear()是点击清除按钮时讲整个画板擦出
3. 最后一个就是画画方法,客户端按下鼠标画画时,调用该方法进行绘制。
页面
<!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.0.0.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>
页面非常简单,一个选择颜色的下拉框,一个画板,和一个清除按钮。
javascript
$(function () {//初始化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();});//signalRvar hub = $.connection.drawingBoard;//缓存颜色hub.state.color = colorElement.val();var connected = false;//改变颜色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();}});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]);}}}};$.connection.hub.start().done(function () {connected = true;});});
实现效果

结束语
参考文献
一步一步学习SignalR进行实时通信_8_案例2的更多相关文章
- 一步一步学习SignalR进行实时通信_6_案例
原文:一步一步学习SignalR进行实时通信_6_案例 一步一步学习SignalR进行实时通信\_6_案例1 一步一步学习SignalR进行实时通信_6_案例1 前言 类的定义 各块功能 后台 上线 ...
- 一步一步学习SignalR进行实时通信_1_简单介绍
一步一步学习SignalR进行实时通信\_1_简单介绍 SignalR 一步一步学习SignalR进行实时通信_1_简单介绍 前言 SignalR介绍 支持的平台 相关说明 OWIN 结束语 参考文献 ...
- 一步一步学习SignalR进行实时通信_9_托管在非Web应用程序
原文:一步一步学习SignalR进行实时通信_9_托管在非Web应用程序 一步一步学习SignalR进行实时通信\_9_托管在非Web应用程序 一步一步学习SignalR进行实时通信_9_托管在非We ...
- 一步一步学习SignalR进行实时通信_7_非代理
原文:一步一步学习SignalR进行实时通信_7_非代理 一步一步学习SignalR进行实时通信\_7_非代理 SignalR 一步一步学习SignalR进行实时通信_7_非代理 前言 代理与非代理 ...
- 一步一步学习SignalR进行实时通信_5_Hub
原文:一步一步学习SignalR进行实时通信_5_Hub 一步一步学习SignalR进行实时通信\_5_Hub SignalR 一步一步学习SignalR进行实时通信_5_Hub 前言 Hub命名规则 ...
- 一步一步学习SignalR进行实时通信_4_Hub
原文:一步一步学习SignalR进行实时通信_4_Hub 一步一步学习SignalR进行实时通信\_4_Hub SignalR 一步一步学习SignalR进行实时通信_4_Hub 前言 创建Hub 配 ...
- 一步一步学习SignalR进行实时通信_3_通过CORS解决跨域
原文:一步一步学习SignalR进行实时通信_3_通过CORS解决跨域 一步一步学习SignalR进行实时通信\_3_通过CORS解决跨域 SignalR 一步一步学习SignalR进行实时通信_3_ ...
- 一步一步学习SignalR进行实时通信_2_Persistent Connections
原文:一步一步学习SignalR进行实时通信_2_Persistent Connections 一步一步学习SignalR进行实时通信\_2_Persistent Connections Signal ...
- 12.Linux软件安装 (一步一步学习大数据系列之 Linux)
1.如何上传安装包到服务器 有三种方式: 1.1使用图形化工具,如: filezilla 如何使用FileZilla上传和下载文件 1.2使用 sftp 工具: 在 windows下使用CRT 软件 ...
随机推荐
- linux ----Inode的结构图
http://www.ruanyifeng.com/blog/2011/12/inode.html 先看看Inode的结构图 再来了解一下文件系统如何存取文件的 1.根据文件名 ...
- 外观模式-Facade
外观模式是为了解决类与类之间依赖关系的,外观模式将类间关系放在一个Facade类中,降低了类类之间的耦合度,该模式中不涉及接口 举一个经典的例子: CPU类: public class CPU { p ...
- RHEL7重置root密码
一.rd.break方法 在linux16那一段的最后,空一格输入rd.break 按Ctrl+启动到单用户模式,如下: 进去后输入命令mount,发现根为/sysroot/,并且不能写,只有ro=r ...
- hihocoder 北大网络赛 E.
给一个1000个点的多边形(从某个点依次按照外形给出每个节点),这个多边形不一定是凸多边形 再给一个圆,问这个多边形与圆相交区域的周长 我们将这个问题分成两个部分,第一部分是求线段在圆内的长度,第二部 ...
- 第二篇:python高级之装饰器
python高级之装饰器 python高级之装饰器 本节内容 高阶函数 嵌套函数及闭包 装饰器 装饰器带参数 装饰器的嵌套 functools.wraps模块 递归函数被装饰 1.高阶函数 高阶函 ...
- Java异常之try,catch,finally,throw,throws
Java异常之try,catch,finally,throw,throws 你能区分异常和错误吗? 我们每天上班,正常情况下可能30分钟就能到达.但是由于车多,人多,道路拥挤,致使我们要花费更多地时间 ...
- 设计模式学习——准备(UML类图)
前言 其实吧,最早接触UML是源于软件设计师的考试,半路出家实在难为我了.学设计模式总是要画类图的,所以补充UML的类图的知识是很重要滴.第一篇就偷懒一点copy别人的东西了.实话说,我们都是踩在巨人 ...
- Android使用 selector 自定义控件背景 (以spinner 为例)
1. 在drawable中设置背景spinner_style.xml 文件 如图: 2. 在 styles.xml 中添加该背景 3. 最后在 spinner 控件添加样式 4.参考 http:// ...
- Asp.net Mvc4 基于Authorize实现的模块访问权限
在MVC中,我们可以通过在action或者controller上设置Authorize[Role="xxx"] 的方式来设置用户对action的访问权限.显然,这样并不能满足我们的 ...
- Visual C#实现Windows信使服务
现在有很多网络管理软件都具备网络上信息实时传送的功能,虽然有些网络通讯软件功能比较强大,有的软件不仅可以传送文本信息,还可以传送二进制文件等.但 它们都有一个无法克服的缺点,那就是分发比较困难,信息传 ...