用SignalR 2.0开发客服系统[系列3:实现点对点通讯]
来源:互联网 发布:中二网络意思 编辑:程序博客网 时间:2024/05/16 01:56
前言
目录:
用SignalR 2.0开发客服系统[系列1:实现群发通讯]
用SignalR 2.0开发客服系统[系列2:实现聊天室]
真的很感谢大家的支持,今天发表系列3,我们的正菜马上就要来了..
开发环境
开发工具:VS2013 旗舰版
数据库:未用
操作系统:WIN7旗舰版
正文开始
首先我们来看看实现的效果:
所用到的方法和类(重要):
其实细心的朋友应该早就发现了,在上篇博客我们就已经用到了这个方法:
//调用指定连接对象的JS Clients.Client(连接对象的唯一标识).addMessage("");//调用指定集合中所有连接对象的JSClients.Clients(集合).addMessage("")
下面上代码:
首先实体类:
很简单,只有一个用户类
using System;using System.Collections.Generic;using System.ComponentModel.DataAnnotations;using System.Linq;using System.Web;namespace SignalRTest{ /// <summary> /// 用户类 /// </summary> public class UserInfo { [Key] public string ContextID { get; set; } public string Name { get; set; } }}
Hub的源码(同样,注释很全,我就不单独的拿出来讲了):
using Microsoft.AspNet.SignalR;using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Threading.Tasks;using Microsoft.AspNet.SignalR.Hubs;using Newtonsoft.Json;namespace SignalRTest{ [HubName("ptopHub")] public class PTPHub : Hub { public static List<UserInfo> UserList = new List<UserInfo>(); //public static List<RoomInfo> RoomList = new List<RoomInfo>(); /// <summary> /// 重写链接事件 /// </summary> /// <returns></returns> public override Task OnConnected() { // 查询用户。 var user = UserList.SingleOrDefault(u => u.ContextID == Context.ConnectionId); //判断用户是否存在,否则添加进集合 if (user == null) { user = new UserInfo() { Name = "", ContextID = Context.ConnectionId }; UserList.Add(user); } return base.OnConnected(); } /// <summary> /// 获取用户名和自己的唯一编码 /// </summary> /// <param name="name"></param> public void GetName(string name) { // 查询用户。 var user = UserList.SingleOrDefault(u => u.ContextID == Context.ConnectionId); if (user != null) { user.Name = name; Clients.Client(Context.ConnectionId).showID(Context.ConnectionId); } GetUserList(); } /// <summary> /// 重写断开的事件 /// </summary> /// <returns></returns> public override Task OnDisconnected() { var user =UserList.Where(u => u.ContextID == Context.ConnectionId).FirstOrDefault(); //判断用户是否存在,存在则删除 if (user != null) { //删除用户 UserList.Remove(user); } //更新所有用户的列表 GetUserList(); return base.OnDisconnected(); } /// <summary> /// 更新所有用户的在线列表 /// </summary> private void GetUserList() { var itme = from a in UserList select new { a.Name, a.ContextID }; string jsondata = JsonConvert.SerializeObject(itme.ToList()); Clients.All.getUserlist(jsondata); } /// <summary> /// 发送消息 /// </summary> /// <param name="contextID"></param> /// <param name="Message"></param> public void SendMessage(string contextID, string Message) { var user = UserList.Where(u => u.ContextID == contextID).FirstOrDefault(); //判断用户是否存在,存在则发送 if (user != null) { //给指定用户发送,把自己的ID传过去 Clients.Client(contextID).addMessage(Message + " " + DateTime.Now,Context.ConnectionId); //给自己发送,把用户的ID传给自己 Clients.Client(Context.ConnectionId).addMessage(Message + " " + DateTime.Now, contextID); } else { Clients.Client(Context.ConnectionId).showMessage("该用户已离线"); } } }}
前端HTML+JS(上次有朋友吐槽JS没注释 - -,实在不好意思,呃..这次加上了..):
<!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.min.js"></script> <script src="Scripts/jquery.signalR-2.0.0.min.js"></script> <!--这里要注意,这是虚拟目录,也就是你在OWIN Startup中注册的地址--> <script src="signalr/hubs"></script> <script type="text/javascript"> var Clients = []; $(function () { chat = $.connection.ptopHub; //注册提示信息方法 chat.client.showMessage = function (Message) { alert(Message); } //注册显示信息的方法 chat.client.addMessage = function (Message,contextID) { if ($.inArray(contextID,Clients) == -1) { AddRoom(contextID); } $("#" + contextID).find("ul").each(function () { $(this).append('<li>' + Message + '</li>') }) } //注册查询房间列表的方法 chat.client.getUserlist = function (data) { if (data) { var jsondata = $.parseJSON(data); $("#roomlist").html(" "); for (var i = 0; i < jsondata.length; i++) { var html = ' <li>用户名:' + jsondata[i].Name + '<button roomname="' + jsondata[i].ContextID + '" onclick="PtoPSendStart(this)">与他聊天</button></li>'; $("#roomlist").append(html); } } } //注册显示个人信息的方法 chat.client.showID = function (data) { $("#ConID").html(data); Clients.push(data); } // 获取用户名称。 $('#username').html(prompt('请输入您的名称:', '')); //连接成功后获取自己的信息 $.connection.hub.start().done(function () { chat.server.getName($('#username').html()); }); }); //开始聊天 function PtoPSendStart(data) { var val = $(data).attr('roomname'); AddRoom(val); } //显示聊天窗口 function AddRoom(val) { Clients.push(val) var html = '<div style="float:left; margin-left:30px; border:double" id="' + val + '" roomname="' + val + '"><button onclick="RemoveRoom(this)">退出</button>\ ' + val + '房间\ 聊天记录如下:<ul>\ </ul>\ <input type="text" /> <button onclick="SendMessage(this)">发送</button>\ </div>' $("#RoomList").append(html); } //发送消息 function SendMessage(data) { var message = $(data).prev().val(); var room = $(data).parent(); var username = $("#username").html(); message = username + ":" + message; var roomname = $(room).attr("roomname"); chat.server.sendMessage(roomname, message); } </script></head><body> <div> <div>名称:<p id="username"></p></div> <div>用户唯一编码:<p id="ConID"></p></div> </div> <div style="float:left;border:double"> <div>在线用户列表</div> <ul id="roomlist"></ul> </div> <div id="RoomList"> </div></body></html>
至此就完成了基本的点对点聊天的功能,真心很感谢大家的支持,希望能对大家有帮助.
我会坚持写完本系列..
0 0
- 用SignalR 2.0开发客服系统[系列3:实现点对点通讯]
- 用SignalR 2.0开发客服系统[系列1:实现群发通讯]
- 用SignalR 2.0开发客服系统[系列2:实现聊天室]
- 用SignalR 2.0开发客服系统[系列4:负载均衡的情况下使用SignalR]
- 用SignalR 2.0开发客服系统[系列5:使用SignalR的中文简体语言包和其他技术点]
- 用SignalR 2.0开发客服系统 续集[系列6:使用自己的连接ID]
- SignalR 2.0 系列:SignalR的高频实时通讯
- 用Visual C#实现局域网点对点通讯
- 用Visual C#实现局域网点对点通讯
- 用Visual C#实现局域网点对点通讯
- 用Visual C#实现局域网点对点通讯
- 用Visual C#实现局域网点对点通讯
- 用Visual C#实现局域网点对点通讯
- 用C#实现局域网点对点通讯
- 用Visual Basic实现点对点通讯
- 用VisualC#实现局域网点对点通讯
- 用C#实现局域网点对点通讯
- SignalR 2.0 系列:SignalR简介
- Android Data Storage(数据存储)之SharedPreferences
- 用SignalR 2.0开发客服系统[系列2:实现聊天室]
- 神经网络简史
- Redhat XFS File System Guide
- Android开发之RecyclerView的上拉刷新和下拉加载
- 用SignalR 2.0开发客服系统[系列3:实现点对点通讯]
- poj 2010
- dede在首页调用文章页全部内容的方法
- Java中的常量、静态域与静态方法
- 键盘弹出时,遮挡文本输入区域
- <Java 并发编程实践>读书笔记 --- 内部锁
- 用SignalR 2.0开发客服系统[系列4:负载均衡的情况下使用SignalR]
- 一文读懂卷积神经网络
- android 常用adb 和 adb shell 命令