用SignalR 2.0开发客服系统[系列3:实现点对点通讯]

简介: 原文:用SignalR 2.0开发客服系统[系列3:实现点对点通讯]前言 目录: 用SignalR 2.0开发客服系统[系列1:实现群发通讯] 用SignalR 2.0开发客服系统[系列2:实现聊天室] 真的很感谢大家的支持,今天发表系列3,我们的正菜马上就要来了.
原文: 用SignalR 2.0开发客服系统[系列3:实现点对点通讯]

前言

目录:

用SignalR 2.0开发客服系统[系列1:实现群发通讯]

用SignalR 2.0开发客服系统[系列2:实现聊天室]

真的很感谢大家的支持,今天发表系列3,我们的正菜马上就要来了..

 

 

开发环境

 开发工具:VS2013 旗舰版

 数据库:未用

 操作系统:WIN7旗舰版

 

正文开始

首先我们来看看实现的效果:

 

所用到的方法和类(重要):

其实细心的朋友应该早就发现了,在上篇博客我们就已经用到了这个方法:

//调用指定连接对象的JS               
Clients.Client(连接对象的唯一标识).addMessage("");

//调用指定集合中所有连接对象的JS
Clients.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>

至此就完成了基本的点对点聊天的功能,真心很感谢大家的支持,希望能对大家有帮助.

我的Q :524808775 加我请注明来源 - -,我们共同讨论.

我会坚持写完本系列..

 

目录
相关文章
|
7月前
|
网络协议 NoSQL API
转转客服IM系统的WebSocket集群架构设计和部署方案
客服IM系统是转转自研的在线客服系统,是用户和转转客服沟通的重要工具,主要包括机器人客服、人工客服、会话分配、技能组管理等功能。在这套系统中,我们使用了很多开源框架和中间件,今天讲一下客服IM系统中WebSocket集群的的实践和应用。
593 141
|
8月前
|
数据安全/隐私保护 容器 Go
开源IM即时通讯系统调研
Lumen IM 是一款企业级开源即时通讯工具,前端采用 Vue3 + Naive UI,后端基于 Go 语言,使用 WebSocket 协议。支持 Docker + Nginx 快速部署,适合私有化环境。功能包括文本、图片、文件消息,内置笔记、群聊及消息历史记录。界面美观、功能完善,适用于企业沟通、团队协作及开发者学习。提供前后端源码,便于快速搭建 IM 系统。
开源IM即时通讯系统调研
|
8月前
|
移动开发 网络协议 小程序
鸿蒙NEXT即时通讯/IM系统RinbowTalk v2.4版发布,基于MobileIMSDK框架、ArkTS编写
RainbowTalk是一套基于开源即时通讯讯IM框架 MobileIMSDK 的产品级鸿蒙NEXT端IM系统。纯ArkTS编写、全新开发,没有套壳、也没走捷径,每一行代码都够“纯血”。与姊妹产品RainbowChat和RainbowChat-Web 技术同源,历经考验。
350 1
|
9月前
|
机器学习/深度学习 人工智能 自然语言处理
从0搭建AI智能客服教程(AI智能客服系统选型和实战指南)
针对智能客服技术与业务脱节的痛点,合力亿捷通过 NLP、知识图谱及人机协同策略,助企业实现首次解决率超 70%、人力成本降 43%、年省成本超千万。其方案提升制造业问题解决率 40%,投诉转接成功率达 99%,以分场景选型助力超万家企业平衡业务与成本,成行业首选。
|
9月前
|
移动开发 缓存 前端开发
可二次开发的在线客服系统-前后端混合渲染模式
服务端渲染(SSR)结合API交互,提升首屏加载速度与SEO友好性,适用于混合渲染模式的Web应用。
172 0
|
9月前
|
前端开发 JavaScript Java
智能客服系统的技术栈解析-唯一客服系统技术架构优势
“唯一客服系统”采用 Vue.js 2.x + ElementUI 构建前端,实现响应式界面,支持多端适配;后端基于 Golang + Gin + GORM,具备高性能与高并发处理能力。系统支持私有化部署,提供灵活定制、AI 扩展能力,技术栈简洁易维护,兼顾开发者友好与企业级应用需求。
382 1
|
9月前
|
测试技术 Go
客服系统程序入口文件解析-唯一客服系统源码开发
该代码为 Go 语言编写的客服系统命令行程序入口,结构清晰,使用 cmd 包启动业务逻辑,可能基于 cobra 框架实现,具备良好可扩展性与可维护性,适用于服务启动与管理。
315 69
|
9月前
|
缓存 移动开发 网络协议
纯血鸿蒙NEXT即时通讯/IM系统:RinbowTalk正式发布,全源码、纯ArkTS编写
RainbowTalk是一套基于MobileIMSDK的产品级鸿蒙NEXT端IM系统,目前已正式发布。纯ArkTS、从零编写,无套壳、没走捷径,每一行代码都够“纯”(详见:《RainbowTalk详细介绍》)。 MobileIMSDK是一整套开源IM即时通讯框架,历经10年,超轻量级、高度提炼,一套API优雅支持 UDP 、TCP 、WebSocket 三种协议,支持 iOS、Android、H5、标准Java、小程序、Uniapp、鸿蒙NEXT,服务端基于Netty编写。
721 1
|
9月前
|
人工智能 自然语言处理 语音技术
深度解析:AI语音客服系统如何重塑客户服务体验与主流解决方案探析
在数字化浪潮下,AI语音客服凭借高效、便捷、24小时在线的优势,成为企业提升服务效率、优化体验的重要工具。本文详解其核心技术、应用价值、选型要点及市场主流方案,如阿里云通义晓蜜、合力亿捷等,助力企业智能化升级。
610 1

热门文章

最新文章

下一篇
开通oss服务