如何在Asp.net中使用SignalR实现一个端对端聊天功能

  介绍

如何在Asp.net中使用SignalR实现一个端对端聊天功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

, public  interface  IHubConnectionContext   ,{   ,T  All {,得到;},//,代表所有客户端      ,T  AllExcept (params  string [], excludeConnectionIds);,//,除了参数中的所有客户端   ,T 客户机(string  connectionId);,//,特定的客户端,这个方法也就是我们实现端对端聊天的关键   ,T 客户(IList

在SignalR中,每一个客户端为标记其唯一性,SignalR都会分配它一个ConnnectionId,这样我们就可以通过ConnnectionId来找到特定的客户端了。这样,我们在向某个客户端发送消息的时候,除了要将消息传入,也需要将发送给对方的ConnectionId输入,这样服务端就能根据传入的ConnectionId来转发对应的消息给对应的客户端了。这样也就完成了端对端聊天的功能。另外,如果用户如果不在线的话,服务端可以把消息保存到数据库中,等对应的客户端上线的时候,再从数据库中查看该客户端是否有消息需要推送,有的话,从数据库取出数据,将该数据推送给该客户端。(不过这点,服务端缓存数据的功能本篇博文没有实现,在这里介绍就是让大家明白QQ一个实现原理)。

下面我们来梳理下端对端聊天功能的实现思路:

客户端登入的时候记录下客户端的ConnnectionId,并将用户加入到一个静态数组中,该数据为了记录所有在线用户。
用户可以点击在线用户中的用户聊的天,在发送消息的时候,需要将ConnectionId一并传入到服务端。
服务端根据传入的消息内容和ConnectionId调用Clients.Client(接头).sendMessage方法来进行转发到对应的客户端。

<强>三,实现酷炫聊天功能核心代码

,有了实现思路,实现功能也就得心应手了,接下来,让我们先看下集线器ChatHub中的代码:

public  class  ChatHub :中心   ,{   ,//静态属性   ,public  static  List();,//,在线用户列表      ,///& lt; summary>   ,///登录连线   ,///& lt;/summary>   ,///& lt; param  name=皍serId"在用户Id   ,///& lt; param  name=皍serName"在用户名& lt;/param>   ,public  void 连接(string  userId, string 用户名)   ,{   var 才能;connnectId =, Context.ConnectionId;      if 才能;(OnlineUsers.Count (x =祝辞,x.ConnectionId ==, connnectId),==, 0)   {才能   if 才能;(OnlineUsers.Any (x =祝辞,x.UserId ==, userId))   {才能   ,,var  items =, OnlineUsers.Where (x =祝辞,x.UserId ==, userId) .ToList ();   ,,foreach  (var  item 拷贝项目)   ,,{   ,,Clients.AllExcept (connnectId) .onUserDisconnected (item.UserName item.ConnectionId也);   ,,}   ,,OnlineUsers.RemoveAll (x =祝辞,x.UserId ==, userId);   ,,}//才能添加在线人员   OnlineUsers.Add才能(new 用户信息   {才能   ,,ConnectionId =, connnectId,   ,,UserId =,标识,   ,,UserName =,用户名,   ,,LastLoginTime =DateTime.Now   ,,});   ,,}//才能,所有客户端同步在线用户   Clients.All.onConnected才能(connnectId,用户名,OnlineUsers);   ,}         ,///& lt; summary>   ,///发送私聊   ,///& lt;/summary>   ,///& lt; param  name=皌oUserId"在接收方用户连接ID   ,///& lt; param  name=癿essage"祝辞内容& lt;/param>   ,public  void  SendPrivateMessage (string  toUserId, string 消息)   ,{   var 才能;fromUserId =, Context.ConnectionId;      var 才能;toUser =, OnlineUsers.FirstOrDefault (x =祝辞,x.ConnectionId ==, toUserId);   var 才能;fromUser =, OnlineUsers.FirstOrDefault (x =祝辞,x.ConnectionId ==, fromUserId);      if 才能;(toUser  !=, null ,,, fromUser  !=, null)   ,{大敌;//才能,send 过多;   Clients.Client才能(toUserId) .receivePrivateMessage (fromUserId, fromUser.UserName,,消息);//才能,send 用caller 用户//才能,Clients.Caller.sendPrivateMessage (toUserId, fromUser.UserName,,消息);   ,,}   其他的才能   {才能//表才能示对方不在线   Clients.Caller.absentSubscriber才能();   ,,}   ,}      ,///& lt; summary>   ,///断线时调用   ,///& lt;/summary>   ,///& lt; param  name=皊topCalled"祝辞& lt;/param>   ,///& lt; returns> & lt;/returns>   ,public  override  Task  OnDisconnected (bool  stopCalled)   ,{   var 才能;user =, OnlineUsers.FirstOrDefault (u =祝辞,u.ConnectionId ==, Context.ConnectionId);//才能,判断用户是否存在,存在则删除   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

如何在Asp.net中使用SignalR实现一个端对端聊天功能