StableVersion4.3/HL_FristAidPlatform_Service/signalr/ChatHub.cs

184 lines
6.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using HL_FristAidPlatform_Help;
using Microsoft.AspNetCore.SignalR;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace HL_FristAidPlatform_Service
{
/// <summary>
///
/// </summary>
public class ChatHub : Hub<IChatClient>
{
/// <summary>
/// 向指定群组发送信息
/// </summary>
/// <param name="groupName">组名</param>
/// <param name="message">信息内容</param>
/// <returns></returns>
public async Task SendMessageToGroupAsync(string groupName, string message)
{
await Clients.Group(groupName).ReceiveUpdate(message);
Help.Info($"通知{groupName}组 {message}.");
}
/// <summary>
/// 加入指定组
/// </summary>
/// <param name="groupName">组名</param>
/// <returns></returns>
public async Task AddToGroup(string groupName)
{
await Groups.AddToGroupAsync(Context.ConnectionId, groupName);
//await Clients.Group(groupName).ReceiveMessage("通知", $"{Context.ConnectionId} 您已经加入{groupName}组.");
Help.Info($"通知{Context.ConnectionId} 您已经加入{groupName}组.");
}
/// <summary>
/// 退出指定组
/// </summary>
/// <param name="groupName">组名</param>
/// <returns></returns>
public async Task RemoveFromGroup(string groupName)
{
await Groups.RemoveFromGroupAsync(Context.ConnectionId, groupName);
Help.Info($"通知{Context.ConnectionId} 您已经退出{groupName}组.");
}
/// <summary>
/// 向指定成员发送信息
/// </summary>
/// <param name="user">成员名</param>
/// <param name="message">信息内容</param>
/// <returns></returns>
public async Task SendPrivateMessage(string user, string message)
{
await Clients.User(user).ReceiveMessage(message);
}
/// <summary>
/// 当连接建立时运行
/// </summary>
/// <returns></returns>
public override Task OnConnectedAsync()
{
//TODO..
Help.Info($"SignalRClient连接已建立");
return base.OnConnectedAsync();
}
/// <summary>
/// 当链接断开时运行
/// </summary>
/// <param name="ex"></param>
/// <returns></returns>
public override Task OnDisconnectedAsync(System.Exception ex)
{
//TODO..
Help.Info($"SignalRClient连接已断开");
return base.OnDisconnectedAsync(ex);
}
/// <summary>
///
/// </summary>
/// <param name="user"></param>
/// <param name="message"></param>
/// <returns></returns>
public async Task SendMessage(string user, string message)
{
await Clients.All.ReceiveMessage(user, message);
Help.Info($"发送给{user}的消息,消息内容:{message}");
}
//定于一个通讯管道,用来管理我们和客户端的连接
//1、客户端调用 WinFormsApp就像订阅
//2、服务端主动向客户端发送数据名字千万不能错
//3、客户端再通过 ReceiveUpdate ,来接收
/// <summary>
///
/// </summary>
/// <param name="name"></param>
/// <param name="msg"></param>
/// <returns></returns>
public async Task WinFormsApp(string name, string msg)
{
await Clients.All.ReceiveUpdate($"接收到{name}的消息,消息内容:{msg}");
Help.Info($"接收到{name}的消息,消息内容:{msg}");
}
/// <summary>
///
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public async Task OnLine(string id)
{
if (PropertyCommon.SignalRConnections.ContainsKey(id))
{
PropertyCommon.SignalRConnections[id] = Context.ConnectionId;
}
else
{
PropertyCommon.SignalRConnections.Add(id, Context.ConnectionId);
}
Help.Info($"接收到{id}上线的消息。");
await Groups.AddToGroupAsync(Context.ConnectionId, id);
Help.Info($"通知{Context.ConnectionId} 您已经加入{id}组.");
// await Groups.AddToGroupAsync(Context.ConnectionId, id);//同一账号登录分到同一组
////所有客户端接收上线提醒
//await Clients.Group(GroupName).SendAsync("receiveNotice", Name);
}
public async Task SendToGroupAsync(string groupName, string message)
{
await Clients.Group(groupName).ReceiveGroupMessage(groupName, message);
Help.Info($"发送给群组{groupName}的消息,消息内容:{message}");
}
/// <summary>
/// 静态用户列表
/// </summary>
private IList<string> userList = UserInfo.userList;
/// <summary>
/// 用户的connectionID与用户名对照表
/// </summary>
private readonly static Dictionary<string, string> _connections = new Dictionary<string, string>();
/// <summary>
/// 用户上线函数
/// </summary>
/// <param name="name"></param>
public void SendLogin(string name)
{
if (!userList.Contains(name))
{
userList.Add(name);
//这里便是将用户id和姓名联系起来
_connections.Add(name, Context.ConnectionId);
}
else
{
//每次登陆id会发生变化
_connections[name] = Context.ConnectionId;
}
//新用户上线,服务器广播该用户名
Clients.All.LoginUser(userList);
}
}
public class UserInfo
{
public static IList<string> userList = new List<string>();
}
}