用SignalR和Layui搭建自己的web聊天网站
1.开发背景
之前是做项目一直有一个困扰,就是如何进行及时通讯,本人.Net开发,不太想用别人的接口,然后偶然的机会知道了SignalR,那么什么是SignalR呢?
2.SignalR简介
ASP.NET SignalR是ASP.NET开发人员的库,它简化了向应用程序添加实时Web功能的过程。实时Web功能是指服务器代码在连接的客户端可用时立即将内容推送到连接的客户端,而不是让服务器等待客户端请求新数据。
SignalR可用于向ASP.NET应用程序添加任何类型的“实时”Web功能。虽然聊天经常被用作示例,但您可以做更多的事情。每当用户刷新网页以查看新数据,或者页面实现长轮询以检索新数据时,它都是使用SignalR的候选者。示例包括仪表板和监视应用程序,协作应用程序(如同时编辑文档),作业进度更新和实时表单。
SignalR还支持全新类型的Web应用程序,这些应用程序需要来自服务器的高频更新,例如实时游戏。
SignalR提供了一个简单的API,用于创建从服务器端.NET代码调用客户端浏览器(和其他客户端平台)中的JavaScript函数的服务器到客户端远程过程调用(RPC)。SignalR还包括用于连接管理的API(例如,连接和断开事件)以及分组连接。
详情可以看一下微软的文档介绍,网址为https://www.asp.net/signalr,全英文,但是可以翻译一下。
3.创建一个MVC项目。
具体创建的过程我就不多做介绍了,https://www.asp.net/signalr这里面都有非常详细的介绍,还有一个demo,可以跟着一步一步做。
项目创建好之后,需要先把需要的NuGet包加进来,就是这个SignalR了,
install-package Microsoft.AspNet.SignalR
然后需要在添加两个类,一个永久连接类,一个集线器类。你可以在创建一个文件夹用来存放这两个类,或者直接放到App_Start文件下。两个类命名分别为Startup.cs 和 ChatHub.cs如下图所示
我是之前添加过,所以直接显示到这里了。第一次添加的话,应该在这里。
添加好这两个类之后,咱们在稍稍做一下修改。打开ChatHub类,修改一下参数,代码为
using System;
using System.Web;
using Microsoft.AspNet.SignalR;
namespace SignalRChat
{
public class ChatHub : Hub
{
public void Send(string name, string message, string datetime, string receiver)
{
Clients.All.broadcastMessage(name, message, datetime, receiver);
}
}
}
这里四个参数 分别为,发送者姓名,发送消息内容,发送时间,以及接收者。
后台修改完了,接下来看页面,回到Index.cshtml,把原来的页面内容可以删了,样式的话我是参考的layui里面的LayIM。https://www.layui.com/demo/layim.html
这里现在需要先引入两个js。
<script src="~/Scripts/jquery.signalR-2.3.0.min.js"></script>
<script src="~/signalr/hubs"></script>
说实话,因为其中一个js,走了不少坑,就是这个hubs,这个文件在项目中是不存在的,只有在项目运行的时候,才会动态生成一个hubs文件,发送消息接收消息js代码如下。
$(function () {
var datetime = getNowFormatDate();
var chat = $.connection.chatHub;
chat.client.broadcastMessage = function (name, message, datetime, receiver) { //发送人姓名 发送消息内容 发送时间 接收人姓名
var sendname = name;
var encodedMsg = message;
var currentname = $("#name").text();// 当前登录系统的用户
if (receiver == currentname) { //接收人收到的消息
$('#chatarea').append('<li><div class="layim-chat-user"><img src="../Content/img/defaultpic.jpg"><cite>' + sendname + '<i>' + datetime + '</i></cite>
</div><div class="layim-chat-text">' + encodedMsg + '</div></li>');
}
else if (sendname == currentname) {
$('#chatarea').append('<li class="layim-chat-mine"><div class="layim-chat-user"><img src="../Content/img/defaultpic.jpg" /><cite><i>' + datetime + '</i>' + sendname + '</cite></div>
<div class="layim-chat-text">' + encodedMsg + '</div> </li >');
}
// layui.form.render();
};
$.connection.hub.start().done(function () {
$(document).keypress(function (e) {
if (e.keyCode == 13) {
$('#setSend').click();
}
})
$('#setSend').click(function () {
var current_id = $("#current_id").val();
if (current_id == "" || current_id == null) {
alert("请先选择聊天对象");
return false;
}
if ($("#txt_message").val() == "" || $("#txt_message").val() == null) {
alert("请输入聊天内容");
}
else {
chat.server.send($("#name").text(), $("#txt_message").val(), getNowFormatDate(), $("#current_id").val()); //发送人姓名 发送消息内容 发送时间 接收人姓名
setTimeout("$(\"#txt_message\").val('')", 0005); //清空消息输入框
//$("#chatarea").children("div:last-child")[0].scrollIntoView(false);
document.getElementById("msg_end").scrollIntoView(true);
}
});
});
});
function htmlEncode(value) {
var encodedValue = $('<div />').text(value).html();
return encodedValue;
}
项目源码地址:https://github.com/ArvinLimeng/WebChat
程序员工具站点:草根工具www.idevtool.com
个人笔记站点:草根笔记note.idevtool.com
用SignalR和Layui搭建自己的web聊天网站的更多相关文章
- 使用SignalR构建一个最基本的web聊天室
What is SignalR ASP.NET SignalR is a new library for ASP.NET developers that simplifies the process ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(一) 之 基层数据搭建,让数据活起来(数据获取)
大家好,本篇是接上一篇 ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(零) 前言 ASP.NET SignalR WebIM系列第二篇.本篇会带领大家将 LayIM ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(二) 之 ChatServer搭建,连接服务器,以及注意事项。
上篇:ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(一) 之 基层数据搭建,让数据活起来(数据获取) 上一篇我们已经完成了初步界面的搭建工作,本篇将介绍IM的核心内容 ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(零) 前言
前端时间听一个技术朋友说 LayIM 2.0 发布了,听到这个消息抓紧去官网看了一下.(http://layim.layui.com/)哎呀呀,还要购买授权[大家支持一下哦],果断买了企业版,喜欢钻研 ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(三) 之 实现单聊,群聊,发送图片,文件。
上篇讲解了如何搭建聊天服务器,以及客户端js怎么和layui的语法配合.服务器已经连接上了,那么聊天还会远吗? 进入正题,正如上一篇提到的我们用 Client.Group(groupId)的方法向客户 ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(零) 前言(内容已过期,阅读请慎重)
2018-09-19 更新 :现在已经更新ASP.NET Core Middleware版本.对.NET Core SignalR感兴趣的朋友移步:https://github.com/fanpan2 ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室 实战系列
ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(零) 前言 http://www.cnblogs.com/panzi/p/5742089.html ASP.NET S ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(四) 之 用户搜索(Elasticsearch),加好友流程(1)。
前面几篇基本已经实现了大部分即时通讯功能:聊天,群聊,发送文件,图片,消息.不过这些业务都是比较粗犷的.下面我们就把业务细化,之前用的是死数据,那我们就从加好友开始吧.加好友,首先你得知道你要加谁.L ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室 实战系列(不断更新中)
项目简介 利用ASP.NET SignalR技术与Layim前端im框架实现的一个简单的web聊天室,包括单聊,群聊,加好友,加群,好友搜索,管理,群组管理,好友权限设置等功能.涉及技术: Elast ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室 实战系列。开源啦!!!
自此系列博客开写以来,好多同学关心开源问题,之前由于网络问题,发布到Github上老是失败,今天终于在精简了好多无用的文件之后发布上去了. 注意:layim源代码并不开源,由于版权问题,请大家去官网了 ...
随机推荐
- 牛客小白月赛105 (Python题解)
牛客小白月赛105 (Python题解) 比赛链接:点击传送 A-lz的吃饭问题 代码: a, b = map(int,input().split()) c, d = map(int,input(). ...
- VulnStack之ATT&CK实战系列———红队实战(一)
目录 前言 环境搭建 外围打点 信息收集 phpmyadmin全局日志getshell 内网信息收集 msf上线 mimikatz抓取明文密码&hash 域信息收集 横向移动 msf+prox ...
- nodejs版本管理工具之nvm
有时候 项目中依赖不同版本的node,这就需要我们使用一个版本管理工具 有序的管理这些node,这里介绍使用nvm GitHub地址:https://github.com/nvm-sh/nvm 前提: ...
- 2-SQL注入渗透与攻防
1.SQL注入基础 1.1 什么是sql注入 一.SQL注入概述 二.数据库概述 1.关系型数据库 关系型数据库,存储格式可以直观的反映实体间的关系,和常见的表格比较相似 关系型数据库中表与表之间有很 ...
- 黑客玩具入门——3、NMAP入门
1.Nmap基础 Nmap是主机扫描工具,它的图形化界面是Zebmap,分布式框架是Dnmap,Nmap可以完成诸如:主机探测.端口扫描.版本检测.系统监测等.并且支持探测脚本的编写. Nmap在实际 ...
- 人工智能大语言模型起源篇(二),从通用语言微调到驾驭LLM
上一篇:<人工智能大语言模型起源篇(一),从哪里开始> (5)Howard 和 Ruder 于2018年发表的<Universal Language Model Fine-tunin ...
- 自定义资源支持:K8s Device Plugin 从原理到实现
本文主要分析 k8s 中的 device-plugin 机制工作原理,并通过实现一个简单的 device-plugin 来加深理解. 1. 背景 默认情况下,k8s 中的 Pod 只能申请 CPU 和 ...
- acode连接termux
在acode中安装AcodeX - Terminal插件 在termux中运行 curl -sL https://raw.githubusercontent.com/bajrangCoder/acod ...
- 【分块】LibreOJ 6277 数列分块入门1
前言 分块是一种优雅的暴力,将数组按块长 \(\sqrt{n}\) 进行分块,可实现区间加法.区间求和和区间逆序对计数等场景,进行 \(m\) 次操作的时间复杂度:\(O(m\sqrt{n})\). ...
- 【字符串哈希+二分】AcWing3508 最长公共子串
题解 首先思考暴力枚举长度为 \(len∈[1, min(strlen(s), strlen(t))]\),最差情况下为字符串 \(s\) 和字符串 \(t\) 全为长度为 \(10000\) 的全英 ...