資料來源:http://www.fangsi.net/1144.html

前言,现在这世道写篇帖子没个前言真不好意思发出来。本贴的主要内容来自于本人在之前项目中所开发的一个小功能,用于OA中的即时通讯。由于当时走的太急,忘记把代码拿出来。想想这已经是大半年前的事情了,时间过了这么久,在当时最新的SignalR2.0.1到现在已经变成了2.2。昨天晚上特地熬了个夜,重新又把它写出来做了一个小小的Demo。当然我只是大自然的搬运工,这个SignalR即时通讯功能里面有一些前端的类库不是我自己写的。我只是改吧改吧~~在此鸣谢 @贤心,是他的几条库才使得我的这个功能如此酷炫。前言猝!

最终效果演示

没个GIF的演示我会拿出来秀?

看上去是不是感觉还可以? 那下面我讲解一下开发步骤。

创建MVC项目

首先我们打开VS2015(当然其它的版本也可以。我只是赶了个时髦,有天心血来潮就给安装了),再依次点击[文件]-[新建]-[项目]后弹出如下界面:
我们选择ASP.NET Web应用程序,并且将项目名称完善好,选择好项目保存路径。再点击确定:

这里为了让等会的操作更加简单我直接选择了一个ASP.NET 4.5的 Empty 模板。并把下方的“为以下项目添加文件夹和核心引用”选择MVC。再点击确定:

好了到这里风云突变狂风大作…一个活生生拥有着MVC核心引用和文件夹的项目已经展现在眼前。下面我们就往项目中加入等会要使用到的SignalR。

为MVC项目在NuGet中引用SignalR

这里用到了NuGet,网上也有很多资源讲解怎么使用这个。我这里只大概讲解一下。首先打开[工具]-[NuGet 程序包管理器]-[管理解决方案的 NuGet 程序包]

接下来在出现的界面中将程序包源改成:联机,然后搜索SignalR。接下来自行解决~.~

使用SignalR

由于此时的项目还是一个Empty的项目,需要通过Startup类来配置OWIN程序,所以要在项目中加入一个OWIN Startup类

创建好之后,再在Configuration函数中加入app.MapSignalR();

好了下面,我们再为SignalR创建一个集线器Hubs,我的习惯是在项目中创建一个Hubs目录,然后把需要创建的HubClass放到里面。下面先在项目中创建一个Hubs目录,再在目录上单击右键选择[添加]-[新建项]选择[SignalR 集线器类]

点击确定,再把新建的HubClass中的Hello函数干掉。然后在类上增加一个特性:[HubName("systemHub")]。既然是要聊天那么自然离不开用户,为了方便管理我建立了一个用户的实体类UserDetail

      /// <summary>
/// 用户细节
/// </summary>
public class UserDetail
{
/// <summary>
/// 连接ID
/// </summary>
public string ConnectionId { get; set; }
/// <summary>
/// 用户ID
/// </summary>
public string UserID { get; set; }
/// <summary>
/// 用户名
/// </summary>
public string UserName { get; set; }
/// <summary>
/// 用户部门
/// </summary>
public string DeptName { get; set; }
/// <summary>
/// 登录时间
/// </summary>
public DateTime LoginTime { get; set; }
}
   

既然用户类有了,那么我们可以在Hub里面创建一个用户池,用来管理在线用户。

    public static List ConnectedUsers = new List();

现在用户池有了,下面需要实现三个功能就能进行登录、上线、下线、私聊操作了。这是下面的逻辑处理代码:

    /// <summary>
/// 登录连线
/// </summary>
/// <param name="userID">用户ID</param>
/// <param name="userName">用户名</param>
/// <param name="deptName">部门名</param>
public void Connect(string userID, string userName, string deptName)
{
var id = Context.ConnectionId; if (ConnectedUsers.Count(x => x.ConnectionId == id) == )
{
if (ConnectedUsers.Count(x => x.UserID == userID) > )
{
var items = ConnectedUsers.Where(x => x.UserID == userID).ToList();
foreach (var item in items)
{
Clients.AllExcept(id).onUserDisconnected(item.ConnectionId, item.UserName);
}
ConnectedUsers.RemoveAll(x => x.UserID == userID);
}
//添加在线人员
ConnectedUsers.Add(new UserDetail { ConnectionId = id, UserID = userID, UserName = userName, DeptName = deptName, LoginTime = DateTime.Now }); // 反馈信息给登录者
Clients.Caller.onConnected(id, userName, ConnectedUsers); // 通知所有用户,有新用户连接
Clients.AllExcept(id).onNewUserConnected(id, userID, userName, deptName, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); }
else
{ }
} /// <summary>
/// 发送私聊
/// </summary>
/// <param name="toUserId">接收方用户连接ID</param>
/// <param name="message">内容</param>
public void SendPrivateMessage(string toUserId, string message)
{
string fromUserId = Context.ConnectionId;
var toUser = ConnectedUsers.FirstOrDefault(x => x.ConnectionId == toUserId);
var fromUser = ConnectedUsers.FirstOrDefault(x => x.ConnectionId == fromUserId); if (toUser != null && fromUser != null)
{
// send to
Clients.Client(toUserId).receivePrivateMessage(fromUserId, fromUser.UserName, message); // send to caller user
//Clients.Caller.sendPrivateMessage(toUserId, fromUser.UserName, message);
}
else
{
//表示对方不在线
Clients.Caller.absentSubscriber();
}
} /// <summary>
/// 离线
/// </summary>
public override System.Threading.Tasks.Task OnDisconnected(bool stopCalled)
{
var item = ConnectedUsers.FirstOrDefault(x => x.ConnectionId == Context.ConnectionId);
if (item != null)
{
Clients.All.onUserDisconnected(item.ConnectionId, item.UserName); //调用客户端用户离线通知
ConnectedUsers.Remove(item);
}
return base.OnDisconnected(stopCalled);
}
   

我这里写的逻辑只是一个简单的示例,这个可以根据自己的想法和需求任意发挥。发挥时遇到问题也欢迎在留言一起交流。服务端代码完了,下面开始建立客户端代码。

客户端调用SignalR

到了这里我们貌似还没有新建页面,访问会报404! 那么我们先在Controllers目录上单击右键选择[添加]-[控制器]在弹出的界面中选择[MVC5控制器]


名字取成Home。然后把@贤心大神的弹层库等等库引用进来。把JS也引用进来。 在这时也能看到在Scripts目录下面有了几个SignalR的js文件。那么既然我们建好Controller了下面就在HomeController的IndexAction上面单击右键选择[添加视图]在调用的时候需要注意的是要引用SignalR的内容:

    <script src="~/Scripts/jquery.signalR-2.2.0.min.js"></script>
<script src="~/signalr/hubs"></script>

至于调用的方法也是比较简单的啦,下面附上简单的示例。更多详细的处理可以下载我的DEMO源码进行参考。

    //实例SystemHub,首字母必须小写才能调用
var systemHub = $.connection.systemHub;
//开始链接到集线器
$.connection.hub.start().done(function () {
//调用服务端函数Connect(首字母小写)以及传递客户端参数进行上线操作
systemHub.server.connect(userid, username, deptname);
});
//新用户上线
systemHub.client.onNewUserConnected = function (id, userID, userName, deptName, loginTime) {
//定义onNewUserConnected客户端函数供服务端调用
};
//用户离线
systemHub.client.onUserDisconnected = function (id, userName) {
//定义onUserDisconnected客户端函数供服务端调用
};
//发送消息时,对方已不在线
systemHub.client.absentSubscriber = function () {
//定义absentSubscriber客户端函数供服务端调用
};
//接收消息
systemHub.client.receivePrivateMessage = function (fromUserId, userName, message) {
//定义receivePrivateMessage客户端函数供服务端调用
};
//发送消息
systemHub.server.sendPrivateMessage(ChatCore.nowchat.id, data.content);
   

好了,关于MVC中使用SignalR的介绍也详细描述了,我只是抛砖引玉把自己以前开发的功能进行分享以及自己的温习。

MVC中使用SignalR打造酷炫实用的即时通讯功能(轉載)的更多相关文章

  1. MVC中使用SignalR打造酷炫实用的即时通讯功能附源码

    前言,现在这世道写篇帖子没个前言真不好意思发出来.本贴的主要内容来自于本人在之前项目中所开发的一个小功能,用于OA中的即时通讯.由于当时走的太急,忘记把代码拿出来.想想这已经是大半年前的事情了,时间过 ...

  2. 学习websocket-SignalR,MVC中使用SignalR打造酷炫实用的即时通讯

    http://www.cnblogs.com/Leo_wl/p/4793284.html http://www.fangsi.net/archives/1144.html

  3. [Asp.net 开发系列之SignalR篇]专题二:使用SignalR实现酷炫端对端聊天功能

    一.引言 在前一篇文章已经详细介绍了SignalR了,并且简单介绍它在Asp.net MVC 和WPF中的应用.在上篇博文介绍的都是群发消息的实现,然而,对于SignalR是为了实时聊天而生的,自然少 ...

  4. MVC中使用SignalR

    MVC中使用SignalR打造酷炫实用的即时通讯功能附源码   前言,现在这世道写篇帖子没个前言真不好意思发出来.本贴的主要内容来自于本人在之前项目中所开发的一个小功能,用于OA中的即时通讯.由于当时 ...

  5. 使用NestedScrollView+ViewPager+RecyclerView+SmartRefreshLayout打造酷炫下拉视差效果并解决各种滑动冲突

    使用NestedScrollView+ViewPager+RecyclerView+SmartRefreshLayout打造酷炫下拉视差效果并解决各种冲突 如果你还在为处理滑动冲突而发愁,那么你需要静 ...

  6. Android酷炫实用的开源框架(UI框架)

    Android酷炫实用的开源框架(UI框架) 前言 忙碌的工作终于可以停息一段时间了,最近突然有一个想法,就是自己写一个app,所以找了一些合适开源控件,这样更加省时,再此分享给大家,希望能对大家有帮 ...

  7. Android酷炫实用的开源框架——UI框架(转)

    转载别人整理好的文章,列出了很多炫酷的UI开源设计 原文地址:http://www.androidchina.net/1992.html 1.Side-Menu.Android分类侧滑菜单,Yalan ...

  8. Android酷炫实用的开源框架(UI框架) 转

    Android酷炫实用的开源框架(UI框架) 前言 忙碌的工作终于可以停息一段时间了,最近突然有一个想法,就是自己写一个app,所以找了一些合适开源控件,这样更加省时,再此分享给大家,希望能对大家有帮 ...

  9. MVC 中使用 SignalR 实现推送功能

    MVC 中使用 SignalR 实现推送功能 一,简介 Signal 是微软支持的一个运行在 Dot NET 平台上的 html websocket 框架.它出现的主要目的是实现服务器主动推送(Pus ...

随机推荐

  1. Windows实时预览markdown

    1.安装Notepad++ 2.打开Notepad++菜单栏的"插件(P)",然后打开"插件管理" 3.搜索"MarkdownViewer++&quo ...

  2. Jmeter(四十四)启动提示 Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5.

    有已知的已知:有些事情我们自己知道自己知道: 我们也知道有已知的未知:这是指我们知道有些事情自己不知道: 但是还有未知的未知:有些事情我们不知道自己不知道:   ---美国国防部长 唐纳德·拉姆斯菲尔 ...

  3. AMD SATA Download (解决win10 磁盘占用100%问题)

    需要下载的AMD SATA 驱动: 下载AMD SATA https://github.com/StoneIsDeveloper/UsefulTools/blob/master/AMD%20SATA/ ...

  4. 性能测试基础---jmeter函数二次开发

    Jmeter函数的二次开发. ·什么时候需要进行jmeter的自定义函数扩展呢? 一般来说,如果我们要对数据进行处理,而jmeter没有提供相应的功能(函数),此时我们可以自己进行自定义函数的扩展. ...

  5. KITTI数据集

    目的 使用雷达点云提供的深度信息 如何实现 将雷达的三维点云投影到相机的二维图像上 kitti数据集简介 kitti的数据采集平台,配置有四个摄像机和一个激光雷达,四个摄像机中有两个灰度摄像机,两个彩 ...

  6. 修改/etc/docker/daemon.json中的log-opts配置发现无效 docker 限制日志大小

    https://colobu.com/2018/10/22/no-space-left-on-device-for-docker/ 在/etc/docker/daemon.json中修改或添加log- ...

  7. django运行报错TypeError: object supporting the buffer API required

    运行django项目报错:TypeError: object supporting the buffer API required 解决方案: 将settings.py中数据库的密码改成字符串格式 源 ...

  8. ESA2GJK1DH1K基础篇: 移植官方MQTT包,让TCP实现MQTT功能(以GPRS模块为例)

    前言 这节代码将在这一节的基础上实现 拷贝第一节测试里面的MQTT文件夹到当前工程 当前工程建个MQTT的文件夹,用于存放那个MQTT文件夹里面的内容 添加文件到里面 注意:::: 实际源码拷贝位置 ...

  9. centos7 计划任务简介

    概述 就像再windows上有计划任务一样,centos7 自然也有计划任务,而且设置更为灵活,好用.再centos7 上可以利用crontab 来执行计划任务, 依赖与 crond 的系统服务,这个 ...

  10. .net项目发布到iis

    参考: https://www.cnblogs.com/teyigou/p/8125379.html https://www.cnblogs.com/kissfu/p/6399472.html htt ...