SignalR服务端嵌入到WPF
用的是.net framework 4.7.2的WPF。
<Window x:Class="EBServerTry.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:EBServerTry"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<WrapPanel VerticalAlignment="Center" HorizontalAlignment="Center" Grid.Row="0">
<Button x:Name="stBtn" Click="stBtn_Click" Height="30" Width="80" Content="启动"/>
<Button x:Name="stopBtn" Click="stopBtn_Click" Height="30" Width="80" Content="停止"/>
</WrapPanel>
<RichTextBox Grid.Row="1" Grid.RowSpan="2" Name="richText" VerticalScrollBarVisibility="Auto"/>
</Grid>
</Window>
using Microsoft.AspNet.SignalR;
using Microsoft.Owin.Cors;
using Microsoft.Owin.Hosting;
using Owin;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
//Microsoft.Owin.Hosting
//Microsoft.Aspnet.SignalR
//Microsoft.Owin.Host.HttpListener
//Install-Package Microsoft.Owin.Cors[不需要]
namespace EBServerTry
{
/// <summary>
/// 客户端需要监听的方法
/// </summary>
public interface IEbTest
{
Task ReceiveMsg(string msg);
Task ReceiveAllClientNames(List<string> names);
}
/// <summary>
/// 服务端Hub
/// </summary>
public class EBTestHub : Hub<IEbTest>
{
/// <summary>
/// key->用户名,value->connectionId
/// </summary>
private static Dictionary<string, string> _connectDict = new Dictionary<string, string>();
private static Dictionary<string, List<string>> _groupInfoDict = new Dictionary<string, List<string>>();
public override Task OnConnected()
{
var a = Context.QueryString["username"];
if (a != null)
{
_connectDict[a] = Context.ConnectionId;
}
return base.OnConnected();
}
public override Task OnDisconnected(bool stopCalled)
{
string username = _connectDict.FirstOrDefault(x => x.Value == Context.ConnectionId).Key;
if(username != null)
{
_connectDict.Remove(username);
}
return base.OnDisconnected(stopCalled);
}
public override Task OnReconnected()
{
return base.OnReconnected();
}
private void WriteToConsole(string msg)
{
//// 在 UI 线程上更新 UI
Application.Current.Dispatcher.Invoke(() =>
{
((MainWindow)Application.Current.MainWindow).WriteToConsole($"{msg}");
});
}
#region 客户端可调用的方法
public Task SendAllTest(string msg)
{
WriteToConsole($"该消息所有连接客户端可见:{msg}");
return Clients.All.ReceiveMsg($"该消息所有连接客户端可见:{msg}");
}
public Task SendOthersTest(string msg)
{
WriteToConsole($"该消息仅发送者不可见:{msg}");
return Clients.Others.ReceiveMsg($"该消息仅发送者不可见:{msg}");
}
public Task SendSelfTest(string msg)
{
WriteToConsole($"该消息仅发送者可见:{msg}");
return Clients.Caller.ReceiveMsg($"该消息仅发送者可见:{msg}");
}
public Task SendUserTest(string username, string msg)
{
string connectionId;
if (_connectDict.TryGetValue(username, out connectionId))
{
WriteToConsole($"收到来自{username}发送的消息:{msg}");
Clients.Client(connectionId).ReceiveMsg($"收到来自{username}发送的消息:{msg}");
}
return Task.CompletedTask;
}
public Task GetAllClientNames()
{
return Clients.Caller.ReceiveAllClientNames(_connectDict.Keys.ToList());
}
public async Task AddUserToGroup(string groupName)
{
await Groups.Add(Context.ConnectionId, groupName);
await Clients.Caller.ReceiveMsg($"当前用户已经被添加到集群{groupName}");
}
public async Task RemoveUserFromGroup(string groupName)
{
await Groups.Remove(Context.ConnectionId, groupName);
await Clients.Caller.ReceiveMsg($"当前用户已经被移除出集群{groupName}");
}
public async Task SendToGroup(string groupName, string msg)
{
await Clients.Group(groupName).ReceiveMsg($"集群{groupName}信息:{msg}");
}
#endregion
}
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.UseCors(CorsOptions.AllowAll);
app.MapSignalR();
}
}
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public IDisposable SignalR { get; set; }
static string SerVerURI = "http://localhost:8080";//部署时候需要填上具体数字!!!!!
public MainWindow()
{
InitializeComponent();
StartServer();
}
private void StartServer()
{
try
{
SignalR = WebApp.Start(SerVerURI);
}
catch(Exception e)
{
WriteToConsole(e.Message);
return;
}
WriteToConsole($"服务正在运行...{SerVerURI}");
}
public void WriteToConsole(string msg)
{
Dispatcher.Invoke(() =>
{
string timeStr = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
richText.AppendText($"[{timeStr}]:{msg} \r\n");
});
}
private void stBtn_Click(object sender, RoutedEventArgs e)
{
}
private void stopBtn_Click(object sender, RoutedEventArgs e)
{
}
}
}
跑在服务器上时候,需要做两件事:
(1)开放服务器的相应端口
(2)ServerUrl改为实际数字的IP地址,而不能是localhost!!
SignalR服务端嵌入到WPF的更多相关文章
- SignalR入门之多平台SignalR服务端
之前创建SignalR服务端是基于Web应用程序而言的.那么能不能把SignalR服务端做成控制台应用程序.Winform或windows服务呢? 答案是肯定的. 之前尽管看起来好像是IIS和ASP. ...
- 创建自托管的SignalR服务端
微软官方例子地址:http://www.asp.net/signalr/overview/deployment/tutorial-signalr-self-host 1.说明: SignalR服务端可 ...
- 记录一次SignalR服务端实现过程
前言:最近手上一个项目需要后端实时推送数据到前端,第一个想到的就是微软的SignalR,由于之前都是平时没事写的Demo,没有用到实际项目中,这次恰好用到了,因此记录下来整个实现过程(网上也有很多类似 ...
- .net core signalR 服务端强制中断用户连接
.net core signalR 服务端断开连接 { } { } *:first-child { } *:last-child { } { } { } { } { } { } { } { } { } ...
- WPF创建SignalR服务端(转)
在网上看到了一个帖子,比较详细,博主写的很好. 地址:http://blog.csdn.net/lordwish/article/details/51786200
- signalr服务端-基础搭建
signalr 支持 iis托管.winform.windowsservices.wpf 托管 这里我采用winfrom托管 首先画一个这样的窗体 在服务项目通过项目管理包安装signalr类库 安装 ...
- C#基于用户和角色的验证,服务端web 客户端wpf
应用程序服务 <?xml version="1.0"?> <!-- For more information on how to configure your ...
- SignalR+NAudio实现语音会话[WPF]
原文:SignalR+NAudio实现语音会话[WPF] 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/lordwish/article/detai ...
- SignalR+AForge实现视频会话[WPF]
原文:SignalR+AForge实现视频会话[WPF] 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/lordwish/article/detai ...
- 在后台主机中托管SignalR服务并广播心跳包
什么是后台主机 在之前的 Asp.NETCore 轻松学系列中,曾经介绍过一个轻量级服务主机 IHostedService ,利用 IHostedService 可以轻松的实现一个系统级别的后台服务, ...
随机推荐
- 幻兽帕鲁/Palworld/支持网络联机 v0.1.5.1
游戏介绍 在广阔的世界中收集神奇的生物"帕鲁",派他们进行战斗.建造.做农活,工业生产等,这是一款支持多人游戏模式的全新开放世界生存制作游戏. 注意事项 先启动STEAM客户端,在 ...
- pnpm : 无法加载文件 \AppData\Roaming\npm\pnpm.ps1,因为在此系统上禁止运行脚本。
1. 安装pnpm npm install -g pnpm #安装 pnpm pnpm --version #查看pnpm版本 安装完成后查看版本时报错 pnpm : 无法加载文件 C:\Users\ ...
- 【论文随笔】会话推荐系统综述(A Survey on Conversational Recommender Systems)
前言 今天读的论文为一篇于2021年5月发表在<ACM计算机调查>(ACM Computing Surveys)的论文,文章提供了对话式推荐系统(CRS)的全面综述,探讨了CRS的定义.概 ...
- [rustGUI][iced]基于rust的GUI库iced(0.13)的部件学习(06):基于iced实现一个简单的图片浏览器
前言 本文是关于iced库的部件介绍,iced库是基于rust的GUI库,作者自述是受Elm启发. iced目前的版本是0.13.1,相较于此前的0.12版本,有较大改动. 本合集是基于新版本的关于分 ...
- python excel 读取:如何读取符合多个条件的记录【出差、外出、调休、年假】
if 语句结合or 实现:读取所有出差.外出.调休.年假的记录 if '出差' in str(c_cell) or '外出' in str(c_cell) or'调休' in str(c_cell) ...
- Web前端入门第 11 问:HTML 常用标签有多少?全量标签有多少?
HELLO,这里是大熊学习前端开发的入门笔记. 本系列笔记基于 windows 系统. 截止发文,MDN 收录的 HTML 全量标签有 126 个,有 18 个标记已弃用. 名词解释:MDN --- ...
- IM服务器:一个使用imserver服务器进行聊天的web端案例
该案例中包含一个基于web网页的前端程序,该案例会使用websocket与IM服务器(imserver)进行通信. 一.环境准备 1.下载 "imserver网页调用案例",并解压 ...
- SQL索引失效的场景有哪些
SQL优化里面主要是围绕索引来展开的,SQL优化的一大重点就是避免索引失效,因为索引失效就会导致全表扫描,数据量很大的情况下能明显感受到查询速度的降低. 下面说说索引失效的各种场景. 使用索引的时候, ...
- DeepSeek 会话补全 API
DeepSeek 会话补全 API 是一个超强大的 AI 对话接口 ,可以让你: 打造自己的 智能聊天机器人 让 AI 帮你 写文章.改代码.编故事 甚至模拟 各种角色(比如猫娘.霸道总裁.科幻作家- ...
- 机器人SLAM导航书重磅来袭
机器人SLAM导航书重磅来袭 互联网和人工智能技术可以看成是对人类大脑的进一步延展,而机器人技术则可以看成是对人类躯体的进一步延展.如果人工智能技术仅仅停留在虚拟的网络和数据之中,那么其挖掘并利用新知 ...