184 lines
6.0 KiB
C#
184 lines
6.0 KiB
C#
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>();
|
||
}
|
||
}
|
||
|