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,实现聊天室 ...
随机推荐
- php中magic_quotes_gpc函数详解
magic_quotes_gpc函数在php中的作用是判断解析用户提示的数据,如包括有:post.get.cookie过来的数据增加转义字符“\”,以确保这些数据不会引起程序,特别是数据库语句因为特殊 ...
- Deep Residual Learning for Image Recognition(MSRA-深度残差学习)
转自:http://blog.csdn.net/solomonlangrui/article/details/52455638 ABSTRACT: 神经网络的训练因其层次加深而 ...
- 用PYTHON实现将电脑里的所有文件按大小排序,便于清理
嘿嘿,慢慢找到写代码的感觉了. 这个小程序涉及的东东还是很多的,数据结构的设计,错误的处理,快速字典排序,文件数值调整.... import os,os.path import glob SUFFIX ...
- Altium Designer 14(或者其他版本)里更改PCB板(图纸)大小
1.在PCB板界面下方有一行不同颜色的图层选项,找到“Keep-Out Layer”,没看见的话点击右箭头即可找到. 2.在“Place”选项里面选择“line”,也就是添加线,把你所有元件用线条 ...
- Qt之QTableView显示富文本(使用了QAbstractTextDocumentLayout和QTextDocument)
http://blog.csdn.net/liang19890820/article/details/50973099
- 【笔试&面试】C#中的程序集
1. C#中的程序集(Assembly) 答:程序集是包含一个或多个类型定义文件和资源文件的集合.它允许我们分离可重用类型的逻辑表示和物理表示. 程序集是一个可重用.可实施版本策略和安全策略 ...
- Linux系统编程(32)—— socket编程之TCP服务器与客户端
TCP协议的客户端/服务器程序的一般流程 服务器调用socket().bind().listen()完成初始化后,调用accept()阻塞等待,处于监听端口的状态,客户端调用socket()初始化后, ...
- HDU-4857(拓扑排序)
Problem Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须在b之前. ...
- idea 14运行java工程报错-Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment variable and mvn script match.
报错信息:Disconnected from the target VM, address: '127.0.0.1:59770', transport: 'socket' -Dmaven.multiM ...
- Scala-函数
package com.mengyao.scala.function /** * Scala函数的声明和使用 * * @author mengyao */object Test1 { //主程序的ma ...