SignalR2.0开发实例之——私聊
一、前言
继续上一章的补充,这章介绍使用私聊的功能。主要通过一个方法 Clients.Client(Context.ConnectionId).showMessage(msg); SignalR框架就会给你找对对应的集线器客户端并调用客户端注册好的showMessage方法,下面具体实例和注意地方
二、干活实战开始
创建一个User类,记录用户名字和集线器代理ID
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace SignalRTest { public class User { public string Name { get; set; } public string ConnectionId { get; set; } } }
TestHub代码
using System; using System.Collections.Generic; using System.Linq; using System.Web; using Microsoft.AspNet.SignalR; using Microsoft.AspNet.SignalR.Hubs; using Newtonsoft.Json; namespace SignalRTest { //Hub的别名,方便前台调用 [HubName("testHHH")] public class TestHub : Hub { /// <summary> /// 用户列表,静态 /// </summary> public static List<User> list = new List<User>(); /// <summary> /// 模拟标示用户身份,静态 /// </summary> ; /// <summary> /// 重写连接方法,如果用户不存在,则新建用户 /// </summary> /// <returns></returns> public override System.Threading.Tasks.Task OnConnected() { var user = list.Where(u => u.ConnectionId == Context.ConnectionId).FirstOrDefault(); if (user == null) { //注册用户 list.Add(new User() { Name = "员工" + i, ConnectionId = Context.ConnectionId }); ++i; UpdatePageUserList(); } GetCurrentClientName(); return base.OnConnected(); } /// <summary> /// 重写断开方法,用户存在则删除用户 /// </summary> /// <returns></returns> public override System.Threading.Tasks.Task OnDisconnected() { var user = list.Where(u => u.ConnectionId == Context.ConnectionId).FirstOrDefault(); if (user != null) { list.Remove(user); UpdatePageUserList(); } return base.OnDisconnected(); } /// <summary> /// 更新页面用户列表,新增用户或者删除用户都需要更新一下 /// </summary> public void UpdatePageUserList() { var json = JsonConvert.SerializeObject(list); Clients.All.refreshUserList(json); } /// <summary> /// 私聊对象方法 /// </summary> /// <param name="ConnectionId"></param> public void StartChat(string ConnectionId, string content) { var user = list.Where(u => u.ConnectionId == ConnectionId).FirstOrDefault(); //判断用户是否存在,存在则发送 if (user != null) { //给指定用户发送,把自己的ID传过去用户找到当前哪个私聊对话框,因为可以打开很多个对话框 Clients.Client(ConnectionId).sendMessage(content + " " + DateTime.Now, Context.ConnectionId); //给自己发送,把用户的ID传给自己找到当前哪个私聊对话框,因为可以打开很多个对话框 Clients.Client(Context.ConnectionId).sendMessage(content + " " + DateTime.Now, ConnectionId); } else { Clients.Client(Context.ConnectionId).showMessage("该用户已离线"); } } /// <summary> /// 得到当前客户端的名字 /// </summary> public void GetCurrentClientName() { var user = list.Where(u => u.ConnectionId == Context.ConnectionId).FirstOrDefault(); Clients.Client(Context.ConnectionId).showCurrentClient(user.Name); } } }
客户端代码
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> <script src="Scripts/jquery-1.10.2.js"></script> <script src="Scripts/jquery.signalR-2.0.0.js"></script> <!--这里要注意,这是虚拟目录,也就是你在OWIN Startup中注册的地址--> <script src="signalr/hubs"></script> </head> <body> <div><span>当前用户端名字:</span><span id="kkk"></span></div> <div style="width:200px;float:left;border:1px solid black;"> <ul id="userList"></ul> </div> <script type="text/javascript"> $(function () { //1.声明一个代理引用集线器,如果集线器没有取别名,则要小写$.connection.testHub;如果有别名则直接写别名就好了 var chatClient = $.connection.testHHH; //注册显示信息方法 chatClient.client.showMessage = function (msg) { alert(msg); } //注册获取当前客户端名字 chatClient.client.showCurrentClient = function (name) { $("#kkk").html(name); } //注册刷新用户列表方法 chatClient.client.refreshUserList = function (data) { var json = $.parseJSON(data); $("#userList").html(""); for (var i = 0; i < json.length; i++) { //动态加载内容到ul中 $("#userList").append($("<li>" + json[i].Name + " <input type='button' name='" + json[i].Name + "' class='" + json[i].ConnectionId + "' onclick='privateChat(this)' value='与他私聊' /></li>")); } } //注册发送消息 chatClient.client.sendMessage = function (msg, id) { $("#" + id + " ul").append($("<li>" + msg + "</li>")); } //3. 必须启动连接 $.connection.hub.start().done(function () { }); }); function privateChat(btn) { var ConnectionId = $(btn).attr("class"); var Name = $(btn).attr("name"); if ($("#" + ConnectionId).length > 0) { alert("已打开对话窗口"); } else { var str = "<div style='width:400px;float:left;border:1px solid black;' id='" + ConnectionId + "'><div>" + "私聊对象:<input type='text' name='name' value='" + Name + "' />" + "<div>" + " <ul id='ul'>" + " <li>开始群聊咯。。。。。。。。。。。。。</li>" + " </ul>" + " <input type='text' name='content' /><input type='button' name='btn' value='发送' onclick='sendMsg(this)' />" + " </div>" + " </div>" + " </div>"; $("body").append($(str)); } } function sendMsg(btn) { var connectionId = $(btn).parent().parent().parent().attr("id");//获取需要发送信息的员工连接ID var content = $(btn).siblings("input").val();//发送内容 var chatClient = $.connection.testHHH; //因为集线程变量作用范围原因,和上面的在$(function(){})中写的chatClient不在一个范围内了,所以在这里重新获取一次才能够调用后台的方法 chatClient.server.startChat(connectionId, content); } </script> </body> </html>
显示结果:
三、注意事项
代码连接:http://pan.baidu.com/s/1o7oNSue
SignalR2.0开发实例之——私聊的更多相关文章
- SignalR2.0开发实例之——设置时间、后台其他地方使用集线器、使用自己的连接ID
一.连接的生命周期设置: 如下: // 该值表示连接在超时之前保持打开状态的时间长度. //默认为110秒 GlobalHost.Configuration.ConnectionTimeout = T ...
- SignalR2.0开发实例之——群发消息
一.前言 ASP .NET SignalR 是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信.什么是实时通信的Web呢?就是让客户端(Web页面)和服务器端可以互相 ...
- SignalR2.0开发实例之——创建房间聊天
SignalR作为一个强大的集线器,已经在hub里面集成了Gorups,也就是分组管理,使用方法如下: //作用:将连接ID加入某个组 //Context.ConnectionId 连接ID,每个页面 ...
- SignalR2.0开发实例之——负载均衡
SignalR 2.0作为一个新的而且强大的通信工具,发布博客之后得到了很多人的支持,谢谢...也有人对性能和架设等问题提出了各种质疑..真的很感谢.. 我特意下载了SignalR 2.0的源码硬着头 ...
- 一篇对OAuth2.0开发实例的介绍
今天看到了博友对SSO的文章,SSO单点登录的讲解突然想写一篇关于OAuth2.0用户授权的介绍. 应用场景:在APP或者网页接入一些第三方应用时,时长会需要用户登录另一个合作平台,比如QQ,微博,微 ...
- 基于Cocos2d-x-1.0.1的飞机大战游戏开发实例(中)
接<基于Cocos2d-x-1.0.1的飞机大战游戏开发实例(上)> 三.代码分析 1.界面初始化 bool PlaneWarGame::init() { bool bRet = fals ...
- 脑洞大开之采用HTML5+SignalR2.0(.Net)实现原生Web视频
目录 对SignalR不了解的人可以直接移步下面的目录 SignalR系列目录 前言 - -,我又来了,今天废话不多说,我们直接来实现Web视频聊天. 采用的技术如下: HTML5 WebRTC Si ...
- 用SignalR 2.0开发客服系统[系列1:实现群发通讯]
前言 交流群:195866844 先说一下我为什么会写这个博客吧,(首先说一下,我是一个小菜鸟,讲的不好请指导 - -,) 前段时间公司的项目涉及到在B/S上使用即时通讯,(其实就是做一个B/S的客 ...
- 用SignalR 2.0开发客服系统[系列2:实现聊天室]
前言 交流群:195866844 上周发表了 用SignalR 2.0开发客服系统[系列1:实现群发通讯] 这篇文章,得到了很多帮助和鼓励,小弟在此真心的感谢大家的支持.. 这周继续系列2,实现聊天室 ...
随机推荐
- Nginx源码研究三:Epoll在NGINX中的使用
Web服务器在面对高并发的情况下,网络的IO一般选择IO复用,像apache选择的Select/poll.Nginx在linux 2.6后选择Epoll做网路IO,提高了WEB服务的并发能力. 在本章 ...
- Dom4j修改xml文档
1. 写出内容到xml文档 XMLWriter writer = new XMLWriter(OutputStream, OutputForamt) wirter.write(Document); 2 ...
- iOS-OC命名规范
IOS开发(OC)中的命名规范 正文:通过读写大量代码我有自己的一套编程思路和习惯,自认为自己的编码习惯还是不错的,代码结构也算清晰,因为我一直以来都是代码看的多写的多,但是总结的比较少,知识经常不成 ...
- 获取Map API Key
开发人员在基于Google Maps服务进行开发之前,需要申请一组验证过的Map API Key,这样才可以使用Google Maps服务.申请过程如下:1.在Eclipse中打开“Window”|“ ...
- mysql redo log
mysql> show variables like '%innodb_log_file_size%'; +----------------------+-----------+ | Varia ...
- FILTER的执行次数和驱动表问题
drop table test1; create table test1 as select * from dba_objects where rownum<1000; drop table t ...
- COJ 0802 非传统题(二)
(颓了这么多天是时候干点正事了QAQ) 非传统题(二) 难度级别:B: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 还是很久很久以前,chx ...
- DELPHI7如何调用带参数的JAVA WebService
对方提供的WebService地址是http://192.168.1.6:8080/test/pic?XH=XX用DELPHI如何调呢 ------解决方案--------------------通过 ...
- Android入门学习:Android 系统框架及应用程序执行过程
Android基础知识学习 新手上路,还请多多帮助.由于初学,博客内容难免有不正确的地方,还请各位多多指教,相互学习! 主要内容: 1.Android层次架构及主要功能 2.Android编程模型,程 ...
- HDOJ 1194 Beat the Spread!(简单题)
Problem Description Superbowl Sunday is nearly here. In order to pass the time waiting for the half- ...