SignalEvoque的简要完成,Signal本田CR-V的另类完成本事

By admin in 4858.com on 2019年5月17日

很久此前公布过一篇名叫《因此三个DEMO学会Signal汉兰达的三种达成格局》的稿子,在那篇文章里面详细介绍了在WEB应用下的常用SignalLAND达成方式,而昨天我们来行使SignalEvoque来落到实处其余的一些用法,比如:B/S
与 C/S互相通信,例如:C/S与C/S通信。

Signal猎豹CS6的另类达成技术,signalr另类技艺

很久在此之前发表过壹篇名称叫《通过四个DEMO学会SignalPAJERO的三种达成形式》的篇章,在那篇作品里面详细介绍了在WEB应用下的常用Signal福特Explorer达成格局,近期日我们来使用SignalKoleos来贯彻别的的片段用法,比方:B/S
与 C/S互相通信,比方:C/S与C/S通信。

壹、B/S 与 C/S相互通信(ASP.NET 向  Winform
 广播音讯)
,先看功效如下:

[HubName(“myHub”)] public class MyHub : Hub { public static
Action<string> SendMsgAction = null; public MyHub() {
SendMsgAction = new Action<string>(SendMsg); } private void
SendMsg(string msg) { Clients.All.RecvMsg(msg); }
[HubMethodName(“broadcast”)] public void Broadcast(string msg) { if
(“broadcast”.Equals(Context.QueryString[“identity”]))
//唯有带有广播者身份技巧举行播放音信 { SendMsg(msg); } } public override
System.Threading.Tasks.Task OnConnected() { return base.OnConnected(); }
[HubMethodName(“testConnect”)] public void TestConnect() {
System.Diagnostics.Debug.Write(“ddd”); } }

ASP.NET 页面:(演示就用了服务器控件,以便到服务端进行发送)

        <div>
            广播消息:<input type="text" id="txtmsg" runat="server"  />
            <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="服务端发送" />
        </div>

ASP.NET CS代码:

        protected void Button1_Click(object sender, EventArgs e)
        {
            if(MyHub.SendMsgAction!=null)
            {
                MyHub.SendMsgAction("服务端发送消息-" + txtmsg.Value);
            }
        }

 在那Ritter别说雅培下,因为MyHub是有接二连三时才会变动实例,我们无能为力直接在服务端获取到MyHub的实例,所以选拔了在MyHub构造函数时,将SendMsg暴光给静态的
SendMsgAction委托,那样服务端就可以直接通过剖断SendMsgAction是不是有订阅来调节是还是不是足以发送消息。那是二个取巧的的模式,当然若是我们有更加好的方法,欢迎沟通。

通过浏览器发送达成格局与事先的篇章介绍的同样,这里运用代理方式,ASP.NET页面代码如下:(不作过多介绍)

    <script src="<%=ResolveUrl("~/Scripts/jquery-1.10.2.min.js") %>" type="text/javascript"></script>
    <script src="<%=ResolveUrl("~/Scripts/jquery.signalR-2.2.2.min.js") %>" type="text/javascript"></script>
    <script src="<%=ResolveUrl("~/signalr/hubs") %>" type="text/javascript"></script>


        <div>
            广播消息:<input type="text" id="txtmsg2"  />
            <input type="button" id="btnSend" value="客户端发送" />
        </div>


    <script type="text/javascript">
        $(function () {

            var myhub = $.connection.myHub;
            $.connection.hub.qs = { "identity": "broadcast" };
            $.connection.hub.start().done(function () {
                $("#btnSend").click(function () {
                    var msg = $("#txtmsg2").val();
                    myhub.server.broadcast("客户端发送消息-" + msg)
                    .done(function () {
                        alert("发送成功!");
                    }).fail(function (e) {
                                alert(e);
                                $("#txtmsg2").focus();
                   });
                });
            });

        });
    </script>

SignalEvoque的简要完成,Signal本田CR-V的另类完成本事。 这里有一个注意点:我们在定义MyHub类时,根据CSharp的代码标准是:类名
及措施名首字母都大写,但JS自动生成的代办JS类及艺术名却会产生JS的命规范,即:函数名第叁个假名是小写,如:MyHub
–>myHub,所认为了便利包容JS调用,在定义Hub类时,用上HubName及HubMethodName性格,钦赐统一名称。

winform客户端接收消息步骤:

壹.由此NuGet安装SignalPAJERO.Client相关组件

4858.com 1

2.Winform CS代码:

    public partial class Form1 : Form
    {
        private HubConnection connection = null;
        private IHubProxy hubProxy = null;
        private System.Threading.SynchronizationContext syncContext = null;

        public Form1()
        {
            InitializeComponent();
            syncContext = System.Threading.SynchronizationContext.Current;
        }

        private  void Form1_Load(object sender, EventArgs e)
        {
           CreateHubConnection();
        }

        /// <summary>
        /// 创建Hub代理类,并启动
        /// </summary>
        private void CreateHubConnection()
        {
            connection = new HubConnection("http://localhost:3510/signalr");//SignalR服务端地址
           hubProxy = connection.CreateHubProxy("MyHub");
           hubProxy.On<string>("RecvMsg", RecvMsg); //订阅接收消息
           connection.Start().Wait();
        }

        /// <summary>
        /// 接收SignalR服务端的消息
        /// </summary>
        /// <param name="msg"></param>
        private void RecvMsg(string msg)
        {
            syncContext.Post((o) => {
                textBox1.Text += string.Format("{0:yyyy-MM-dd HH:mm:ss}{1}\r\n", DateTime.Now, o);
            }, msg);
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            connection.Dispose();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            hubProxy.Invoke("TestConnect");//调用SignalR服务端的方法
        }

    }

 通过上述代码能够看看,与ASP.NET
页面生成的JS代理类的措施原理基本同样,都以经过代理类来与服务端进行交互,都以经过HTTP协议进行广播发表。

 二、C/S 与 C/S
相互通信(winform与winform)
,其实本质上服务端依然B/S,只可是大家运用了SignalHighlanderself Host(里面用到了OWIN self
Host),也等于将网址寄宿到winform而矣,只是大家因此winform操作更方更而矣,效果如下:

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

3.编辑OWIN 的夜宿代码,MyHub与上文中的壹律,故不再贴出

    public partial class Form1 : Form
    {
        private IDisposable webHost = null;

        public static Form1 Current = null;

        public Form1()
        {
            InitializeComponent();
            this.Text = "SignalR Winform服务端";
            Current = this;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                webHost = WebApp.Start<Startup>("http://localhost:3512");
                label2.Text = "http://localhost:3512";
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            try
            {
                webHost.Dispose();
            }
            catch
            { }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if(MyHub.SendMsgAction!=null)
            {
                MyHub.SendMsgAction(textBox1.Text);
            }
        }

        public void ShowMsg(string msg)
        {
            this.Invoke(new MethodInvoker(() => {
                listBox1.Items.Add(msg);
            }));
        }
    }

4858.com , 这里有多少个小细节供给专注:

一.装置Microsoft.AspNet.SignalKoleos后会在品种中生成Sciprts文件夹,这一个在winform项目时就足以去除掉;

2.安装Microsoft.AspNet.Signal逍客 Self
Host后,编写翻译可能无难点,但运维起来时,可能会报朱找到相称的OWin程序集,那一个是因为OWIN版本难点,只需单独再安装一下内定的OWIN版本就可以。

 

很久此前发布过一篇名字为《通过多个DEMO学会SignalOdyssey的两种实现格局》的篇章,在那篇小说里面详细介…

   ASP.NET
Signal途睿欧是ASP.NET开荒职员的一个新库,它让你的应用程序增多实时Web作用变得特别轻便。什么是“实时互连网”功用?能够实时地将劳动器端代码推送到三番五次的客户端的力量。

一、B/S 与 C/S相互通信(ASP.NET 向  Winform
 广播音信)
,先看功用如下:

您也许早就听大人讲过WebSockets,壹种新的HTML5API,能够实现浏览器和服务器之间的双向通信。SignalLAND将要可用的封皮下利用WebSockets,借使不是,您的应用程序代码保持不变,则足以健康地回退到任何本领和技术。

4858.com 2

Signal瑞鹰还提供了八个特别简单的高端API,用于在ASP.NET应用程序中实行服务器到客户端RPC(在客户端的浏览器中从服务器端.NET代码调用JavaScript函数),以及为总是管理加多有用的钩,例如连接/断开事件,分组连接,授权。

如上海体育地方所示,采取服务端发送新闻(指在C#代码发送),然后winform接收音讯。

                                                                       
                                                                       
                                       —来自Signal大切诺基的合法证实

4858.com 3

 

如上海体育地方所示,采服客户端(浏览器)JS
代理对象发送音讯,然后winform接收消息。

  依照SignalOdyssey的官方网址教程,做一些简易的剖判。

上述示范的兑今世码如下:

一.想要使用Signal科雷傲要引进它的创建,Microsoft.AspNet.Signal路虎极光。

ASP.NET 服务端代码:

在您的web项目中,应用NuGet包工具引进。怎么引进包能够到NuGet的官方网址看教程。

MyHub:

二.新建1个Signal汉兰达集线器类,那样就能够得到三个合龙自Hub的类,

    [HubName("myHub")]
    public class MyHub : Hub
    {
        public static Action<string> SendMsgAction = null;
        public MyHub()
        {
            SendMsgAction = new Action<string>(SendMsg);
        }

        private void SendMsg(string msg)
        {
            Clients.All.RecvMsg(msg);
        }

        [HubMethodName("broadcast")]
        public void Broadcast(string msg)
        {
            if ("broadcast".Equals(Context.QueryString["identity"])) //只有带有广播者身份才能进行广播消息
            {
                SendMsg(msg);
            }
        }


        public override System.Threading.Tasks.Task OnConnected()
        {
            return base.OnConnected();
        }

        [HubMethodName("testConnect")]
        public void TestConnect()
        {
            System.Diagnostics.Debug.Write("ddd");
        }
    }

能够经过打标签的章程改换集线器的名字,那在客户端代码会用到。

ASP.NET 页面:(演示就用了服务器控件,以便到服务端进行发送)

方式是[HubName(“myHub”)],命名空间是在Microsoft.AspNet.Signal昂Cora.Hubs下。

        <div>
            广播消息:<input type="text" id="txtmsg" runat="server"  />
            <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="服务端发送" />
        </div>

3.引进贰个安顿类,这里用的是Startup,能够通过OWIN Startup类获得。

ASP.NET CS代码:

代码如下:

        protected void Button1_Click(object sender, EventArgs e)
        {
            if(MyHub.SendMsgAction!=null)
            {
                MyHub.SendMsgAction("服务端发送消息-" + txtmsg.Value);
            }
        }
using Microsoft.Owin;
using Owin;
[assembly: OwinStartup(typeof(SignalRChat.Startup))]
namespace SignalRChat
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // Any connection or hub wire up and configuration should go here
            app.MapSignalR();
        }
    }
}

 在此处非常说澳优(Ausnutria Hyproca)下,因为MyHub是有连日时才会扭转实例,大家不也许直接在服务端获取到MyHub的实例,所以选择了在MyHub构造函数时,将SendMsg揭穿给静态的
SendMsgAction委托,那样服务端就足以间接通过判定SendMsgAction是不是有订阅来支配是还是不是足以发送音讯。那是一个取巧的的不二等秘书诀,当然假设我们有更加好的方式,接待交换。

  那么些类未来的职能正是计划。个中app.MapSignalGL450();即是布局全数的集线器。

通过浏览器发送完毕格局与此前的篇章介绍的一样,这里运用代理方式,ASP.NET页面代码如下:(不作过多介绍)

中间IAppBuilder在Owin命名空间,OwinStartup在Microsoft.Owin命名空间。

    <script src="<%=ResolveUrl("~/Scripts/jquery-1.10.2.min.js") %>" type="text/javascript"></script>
    <script src="<%=ResolveUrl("~/Scripts/jquery.signalR-2.2.2.min.js") %>" type="text/javascript"></script>
    <script src="<%=ResolveUrl("~/signalr/hubs") %>" type="text/javascript"></script>


        <div>
            广播消息:<input type="text" id="txtmsg2"  />
            <input type="button" id="btnSend" value="客户端发送" />
        </div>


    <script type="text/javascript">
        $(function () {

            var myhub = $.connection.myHub;
            $.connection.hub.qs = { "identity": "broadcast" };
            $.connection.hub.start().done(function () {
                $("#btnSend").click(function () {
                    var msg = $("#txtmsg2").val();
                    myhub.server.broadcast("客户端发送消息-" + msg)
                    .done(function () {
                        alert("发送成功!");
                    }).fail(function (e) {
                                alert(e);
                                $("#txtmsg2").focus();
                   });
                });
            });

        });
    </script>

肆.客户端(这里运用的是网页的客户端,是用js代理的)

 这里有三个注意点:大家在定义MyHub类时,依据C夏普的代码标准是:类名
及措施名首字母都大写,但JS自动生成的代理JS类及艺术名却会变成JS的命规范,即:函数名第多少个字母是小写,如:MyHub
–>myHub,所感到了有利于兼容JS调用,在定义Hub类时,用上HubName及HubMethodName天性,内定统一名称。

引进SIgnalPRADO组件的时候,会变动3个Scripts文件,里面含有JQuery和signaRubicon的js文件。

winform客户端接收新闻步骤:

在做网页前能够先测试signal中华V是还是不是配备成功,通过
项目地址/signalr/hubs如能张开,

①.因此NuGet安装Signal途锐.Client相关组件

彰显文件就认证配置成功了。文件里证实了代理的js‘类’;

4858.com 4

 

2.Winform CS代码:

在客户端按顺序引进JQuery、signalr。最后引进<script
src=”/signalr/hubs”></script>

    public partial class Form1 : Form
    {
        private HubConnection connection = null;
        private IHubProxy hubProxy = null;
        private System.Threading.SynchronizationContext syncContext = null;

        public Form1()
        {
            InitializeComponent();
            syncContext = System.Threading.SynchronizationContext.Current;
        }

        private  void Form1_Load(object sender, EventArgs e)
        {
           CreateHubConnection();
        }

        /// <summary>
        /// 创建Hub代理类,并启动
        /// </summary>
        private void CreateHubConnection()
        {
            connection = new HubConnection("http://localhost:3510/signalr");//SignalR服务端地址
           hubProxy = connection.CreateHubProxy("MyHub");
           hubProxy.On<string>("RecvMsg", RecvMsg); //订阅接收消息
           connection.Start().Wait();
        }

        /// <summary>
        /// 接收SignalR服务端的消息
        /// </summary>
        /// <param name="msg"></param>
        private void RecvMsg(string msg)
        {
            syncContext.Post((o) => {
                textBox1.Text += string.Format("{0:yyyy-MM-dd HH:mm:ss}{1}\r\n", DateTime.Now, o);
            }, msg);
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            connection.Dispose();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            hubProxy.Invoke("TestConnect");//调用SignalR服务端的方法
        }

    }

诸如此类1个文本,因为它是动态变化的,所以看不见,那几个正是事先测试所在的文件集;

 通过上述代码能够见见,与ASP.NET
页面生成的JS代理类的章程原理基本一样,都是透过代办类来与服务端进行相互,都以透过HTTP协议举办报纸发表。

接下去就能够写js代码了:

 2、C/S 与 C/S
相互通信(winform与winform)
,其实本质上服务端照旧B/S,只可是大家选用了Signal哈弗self Host(里面用到了OWIN self
Host),也正是将网址寄宿到winform而矣,只是大家因此winform操作更方更而矣,效果如下:

var
proxy=$.connection.chatName;当中chatName是你集线器的名称。那样就获得了hub代理成员。

4858.com 5

此地本身测试的是hub的名字首字母是小写的,大写的会找不到,具体的能够透过”/signalr/hubs”这些途径找。

winform服务端完结流程:

 

1.先由此NuGet 分别设置Microsoft.AspNet.SignalLX570、Microsoft.AspNet.SignalPRADOSelf Host,如下图示:

proxy.client.addMessage(function(){

4858.com 6

alert(“对了”);

 

});

4858.com 7

//这里是登记客户端的措施,让服务端调用,也正是事先新建的hub。

贰.加多Startup类文件,并在里头增多映射Signal君越,代码如下:(与ASP.NET服务端的Startup代码一样)

 

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

$.connection.hub.start().done(function(){

叁.编写制定OWIN 的夜宿代码,MyHub与上文中的均等,故不再贴出

$(“#btn”).click(function(){

    public partial class Form1 : Form
    {
        private IDisposable webHost = null;

        public static Form1 Current = null;

        public Form1()
        {
            InitializeComponent();
            this.Text = "SignalR Winform服务端";
            Current = this;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                webHost = WebApp.Start<Startup>("http://localhost:3512");
                label2.Text = "http://localhost:3512";
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            try
            {
                webHost.Dispose();
            }
            catch
            { }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if(MyHub.SendMsgAction!=null)
            {
                MyHub.SendMsgAction(textBox1.Text);
            }
        }

        public void ShowMsg(string msg)
        {
            this.Invoke(new MethodInvoker(() => {
                listBox1.Items.Add(msg);
            }));
        }
    }

proxy.server.hello();

 这里有几个小细节须要专注:

});

1.设置Microsoft.AspNet.Signal哈弗后会在品种中生成Sciprts文件夹,这几个在winform项目时就足以去除掉;

});

二.设置Microsoft.AspNet.Signal帕杰罗 Self
Host后,编写翻译可能无难题,但运转起来时,大概会报朱找到相配的OWin程序集,这么些是因为OWIN版本难题,只需单独再安装一下点名的OWIN版本就可以。

//start是敞开连接,done是翻开连接成功后的回调函数

 

//在那么些回调函数中调用了劳动端hello方法。

里头服务段方法为

public void Hello()
        {
            Clients.All.addMessage();

        }

  在服务端又调用了客户端的不二等秘书诀,addMessage正是挂号在服务端的不二秘籍。

 

$.connection 拿到建立的这个连接。
$.connection.hubName 拿到连接里对应的hub对象
$.connection.hubName.client 拿到客服端对象。
$.connection.hubName.server 拿到服务端对象。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有