SignalR入门代码示例 (Windows Form)客户端 和服务端

2021-09-26  乐帮网

netcore signalr

在这里提供SignalR入门级代码示例和演示。如果你不知道什么是SignalR请先进行简单的学习
https://docs.microsoft.com/zh-cn/aspnet/signalr/overview/getting-started/introduction-to-signalr
https://docs.microsoft.com/zh-cn/aspnet/core/signalr/introduction?view=aspnetcore-5.0

需要说明的是SignalR现在分两大类即 传统.Net下 和 ASP .Net Core SignalR。两类的差别比较大,不能通用。本文写了一个示例代码,服务端使用的是 NetCore SignalR,客户端使用 Windows Form来展示登录。也就是当前最流行的ASP .Net Core平台下的SignalR。
也可以是以下几种《 使用 JavaScript 的 SignalR》《使用 TypeScript 的 SignalR》《使用 Blazor 的 SignalR》等。客户端可用语言.Net 或者Java 或者JavaScript都可以。
正如上所述本示例使用NetCore SignalR 做为服务端, Windows Form做为服务端。 使用Visual Stuido2019开发,实现代码如下:服务端定时往客户端下发地理位置的坐标信息,客户端主动连接,连接后加入指定的组,然后服务端通过组来定向发送数据。

一些代码示例:

public partial class MainWindow : Window
    {
        HubConnection connection;
        public MainWindow()
        {
            InitializeComponent();

            connection = new HubConnectionBuilder()
                .WithUrl("http://localhost:53353/ChatHub")
                .Build();

            connection.Closed += async (error) =>
            {
                await Task.Delay(new Random().Next(0,5) * 1000);
                await connection.StartAsync();
            };
        }

        private async void connectButton_Click(object sender, RoutedEventArgs e)
        {
            connection.On<string, string>("ReceiveMessage", (user, message) =>
            {
                this.Dispatcher.Invoke(() =>
                {
                   var newMessage = $"{user}: {message}";
                   messagesList.Items.Add(newMessage);
                });
            });

            try
            {
                await connection.StartAsync();
                messagesList.Items.Add("Connection started");
                connectButton.IsEnabled = false;
                sendButton.IsEnabled = true;
            }
            catch (Exception ex)
            {
                messagesList.Items.Add(ex.Message);
            }
        }

        private async void sendButton_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                await connection.InvokeAsync("SendMessage", 
                    userTextBox.Text, messageTextBox.Text);
            }
            catch (Exception ex)
            {                
                messagesList.Items.Add(ex.Message);                
            }
        }
    }

服务端

 /// <summary>
    /// https://lebang2020.cn/details/210926wdbcu5oi.html
    /// </summary> 
 public class SignalHub : Hub
    {
        private static Assembly _assembly = typeof(SignalHub).Assembly;

        private readonly ILogger<SignalHub> _logger;

        public SignalHub(ILogger<SignalHub> logger)
        {
            _logger = logger;
        }

        /// <summary>
        /// Log connection
        /// </summary>
        /// <returns></returns>
        public override async Task OnConnectedAsync()
        {
            await base.OnConnectedAsync();
            _logger.LogInformation($"{Context.ConnectionId} Connected.");
        }

        /// <summary>
        /// Log disconnection
        /// </summary>
        /// <param name="e"></param>
        /// <returns></returns>
        public override async Task OnDisconnectedAsync(Exception e)
        {
            await base.OnDisconnectedAsync(e);
            _logger.LogInformation($"Disconnected {e?.Message} {Context.ConnectionId}");
           
        }

        public async Task AddToGroup(string groupName)
        {
            await Groups.AddToGroupAsync(Context.ConnectionId, groupName);
            _logger.LogInformation($"{Context.ConnectionId} AddToGroup {groupName}.");
        }

        public async Task RemoveFromGroup(string groupName)
        {
            await Groups.RemoveFromGroupAsync(Context.ConnectionId, groupName);
            _logger.LogInformation($"{Context.ConnectionId} RemoveFromGroup {groupName}.");
        }

      
    }

可以直接下载,首先运行 Web 主程序,再运行Windows form下的Debug下生成的exe文件就能实时收到坐标信息。

链接:https://pan.baidu.com/s/1Xe-rPQ7YxHsTygZIRJ_KWA 
提取码:捐赠后可见

 

公众号二维码

关注我的微信公众号
在公众号里留言交流
投稿邮箱:1052839972@qq.com

庭院深深深几许?杨柳堆烟,帘幕无重数。
玉勒雕鞍游冶处,楼高不见章台路。
雨横风狂三月暮。门掩黄昏,无计留春住。
泪眼问花花不语,乱红飞过秋千去。

欧阳修

付款二维码

如果感觉对您有帮助
欢迎向作者提供捐赠
这将是创作的最大动力