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
庭院深深深几许?杨柳堆烟,帘幕无重数。
玉勒雕鞍游冶处,楼高不见章台路。
雨横风狂三月暮。门掩黄昏,无计留春住。
泪眼问花花不语,乱红飞过秋千去。
如果感觉对您有帮助
欢迎向作者提供捐赠
这将是创作的最大动力