BS和CS端signal R相互通讯 供学习使用

BS端代码

先创建一个以mvc为模板的网站,然后添加signalr项目

 

然后创建Startup服务

在startup进行相关的配置

 

 public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // 有关如何配置应用程序的详细信息,请访问 https://go.microsoft.com/fwlink/?LinkID=316888            
           
//跨域必须在注册前面,否则会跨域失败
            app.Map("/signalr", map =>
            {
                map.UseCors(CorsOptions.AllowAll);//跨域
                var hubConfiguration = new HubConfiguration
                {
                    EnableJSONP = true
                };
                map.RunSignalR(hubConfiguration);
            });
//注册SignalR
            app.MapSignalR();

        }
    }

在刚才创建的Hub集线器类中创建自己的方法

  [HubName("MyHub")]//hub的名称 如果不写此代码 在前台调用时首字母要小写
    public class MyHub: Hub
    {
        //使用日志记录通讯日志
        private readonly ILog log = log4net.LogManager.GetLogger("MyHub");
        /// <summary>
        ///  发送消息/接受消息
        /// </summary>
        /// <param name="info"></param>
        public void SendMsg()
        {
           
            Clients.All.ReceiveMsg();//全部人员接收消息
            Clients.Client(“Id”).ReceiveMsg();//发送指定用户消息 Id是signalr生成的 这里就不介绍了,可以去查询一些资料
           log.Info("发送消息成功");
        }
        
    }

发送消息需要的代码

 var connection = new HubConnection("http://127.0.0.1:8006/");//发布的站点
                var myHub = connection.CreateHubProxy("MyHub");//创建集线器
                //链接服务器
                connection.Start().ContinueWith(task =>
                {
                    if (task.IsFaulted)
                    {
                        Console.WriteLine("链接失败", task.Exception.GetBaseException());
                    }
                    else
                    {
                        Console.WriteLine("链接成功");
                    }
                }).Wait();
                //发送消息
                    myHub.Invoke("SendMsg").ContinueWith(task =>
                    {
                        if (task.IsFaulted)
                        {
                            Console.WriteLine("调用失败 {0}", task.Exception.GetBaseException());
                        }
                        else
                        {
                            Console.WriteLine("发送消息成功");
                        }
                    });
               

在前端接收消息时

<script src="~/Scripts/jquery-3.4.1.js"></script>//jq脚本
<script src="~/Scripts/jquery.signalR-2.2.2.min.js"></script>//signalR的脚本添加集线器时会自动生成脚本,自己手动引用就行
<script src="/signalr/hubs"></script>//这个是signalR运行时生成的,现在引用即可
<center>
    <h1>
        通信服务器端
    </h1>

</center>

<button onclick="sendmsg()">

    发送消息
</button>
<script type="text/javascript">
    var connection = $.connection.MyHub;
    //get a reference to the hub
    //日记记录 开启true,关闭false
    $.connection.hub.logging = true;
    // 启动 connection
    $.connection.hub.start().done(function () {
        //调用服务器端方法
        console.log("连接成功");
    }).fail(function () {
        console.log("连接失败");
    });

//接收消息的方法 如果需要传参就在方法上加入参数的类型,并进行传值 前后端参数需要一致
    connection.client.receiveMsg= function () {
        console.log("接收消息成功");
    }
    

    function sendmsg() {
        $.ajax({
            url: "/Home/sendmsg"
        });

    }


</script>

CS端代码

在cs端需要接收消息时的代码

先创建一个窗体应用程序,然后通过NUGet查找SignalR.client

并且下载

先拖拉自己需要的控件,我的应用程序是这个样子的

主要控件有(比较懒就C+V了,就不介绍了,自己拖拉就🆗了)

        private System.Windows.Forms.NotifyIcon notifyIcon1;
        private System.Windows.Forms.Panel panel1;
        private System.Windows.Forms.TextBox textBox1;
        private System.Windows.Forms.Timer timer2;
        private System.Windows.Forms.Button button1;

后端代码:

  public partial class Form1 : Form
    {
        private int i = 1;

        public Form1()
        {
            InitializeComponent();

            System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;//这个是执行线程时通过textbox打印消息
            this.ShowInTaskbar = false;//这个是运行时显示任务栏里面
            this.WindowState = FormWindowState.Minimized;//开始最小化
            int x = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Size.Width - this.Width;
            int y = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Height - this.Height;
            this.SetDesktopLocation(x, y);//程序运行时出现的位置
            Task.Run(() => { StartService(); }); // 异步启动SignalR服务
        }
      //双击时显示主窗体
        private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            this.Visible = true;
            this.WindowState = FormWindowState.Normal;
            this.ShowInTaskbar = true;
        }

        private void Form1_Resize(object sender, EventArgs e)
        {
            if (this.WindowState == FormWindowState.Minimized)
            {
                notifyIcon1.Visible = true;
                this.ShowInTaskbar = false;
            }
            else
            {
                notifyIcon1.Visible = false;
            }
        }
        //启动signalr服务
        private bool StartService()
        {
            bool result = false;
            try
            {
                string SignalIP = Convert.ToString(ConfigurationManager.AppSettings["SignalIP"]);//发布的站点地址
                var connection = new HubConnection(SignalIP);
                var myHub = connection.CreateHubProxy("MYHub");//创建集线器                
                myHub.On("ReceiveMsg", ReceiveMag);//调用接收消息方法
                //链接服务器
                connection.Start().ContinueWith(task =>
                {
                    if (task.IsFaulted)
                    {
                        this.textBox1.Text += "连接失败," + task.Exception.GetBaseException() + DateTime.Now + Environment.NewLine;
                    }
                    else
                    {
                        this.textBox1.Text += "连接成功" + DateTime.Now + Environment.NewLine;
                    }
                }).Wait();
                result = true;
            }
            catch (Exception)
            {
                result = false;
            }
            return result;
        }
        public void ReceiveMag()//线程方法
        {
            Thread mythread = new Thread(OnLineReceiveMsg);线程开始
            mythread.Start();
        }
        public void OnLineReceiveMsg()//执行的线程
        {
            if (i % 200 == 0)
            {
                this.textBox1.Text = "";
                i = 1;
            }
            else
            {
                this.textBox1.Text += "序号" + string.Format("{0:d3}", i) + "|有新的任务需要处理," + "时间:" + DateTime.Now + Environment.NewLine;
                i++;
            }
            this.WindowState = FormWindowState.Normal;
        }

        private void button1_Click(object sender, EventArgs e)//手动连接服务器
        {
            Task.Run(() => { StartService(); }); // 异步启动SignalR服务
        }
    }

使用SignalR还可以做推送聊天功能,需要开发的地方还有许多,

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值