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还可以做推送聊天功能,需要开发的地方还有许多,