博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用SignalR 2.0开发客服系统[系列3:实现点对点通讯]
阅读量:5773 次
发布时间:2019-06-18

本文共 3955 字,大约阅读时间需要 13 分钟。

原文:

前言

目录:

真的很感谢大家的支持,今天发表系列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{    ///     /// 用户类    ///     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
UserList = new List
(); //public static List
RoomList = new List
(); ///
/// 重写链接事件 /// ///
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(); } ///
/// 获取用户名和自己的唯一编码 /// ///
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(); } ///
/// 重写断开的事件 /// ///
public override Task OnDisconnected() { var user =UserList.Where(u => u.ContextID == Context.ConnectionId).FirstOrDefault(); //判断用户是否存在,存在则删除 if (user != null) { //删除用户 UserList.Remove(user); } //更新所有用户的列表 GetUserList(); return base.OnDisconnected(); } ///
/// 更新所有用户的在线列表 /// 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); } ///
/// 发送消息 /// ///
///
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没注释 - -,实在不好意思,呃..这次加上了..):

点对点聊天
名称:

用户唯一编码:

在线用户列表

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

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

    我会坚持写完本系列..

     

    转载地址:http://dwaux.baihongyu.com/

    你可能感兴趣的文章
    Microsoft Exchange Server 2010与Office 365混合部署升级到Exchange Server 2016混合部署汇总...
    查看>>
    Proxy服务器配置_Squid
    查看>>
    【SDN】Openflow协议中对LLDP算法的理解--如何判断非OF区域的存在
    查看>>
    纯DIV+CSS简单实现Tab选项卡左右切换效果
    查看>>
    Centos7同时运行多个Tomcat
    查看>>
    使用CocoaPods过程中的几个问题
    查看>>
    Spring boot 整合CXF webservice 全部被拦截的问题
    查看>>
    Pinpoint跨节点统计失败
    查看>>
    机房带宽暴涨问题分析及解决方法
    查看>>
    XP 安装ORACLE
    查看>>
    八、 vSphere 6.7 U1(八):分布式交换机配置(vMotion迁移网段)
    查看>>
    [转载] 中华典故故事(孙刚)——19 万岁
    查看>>
    php5编译安装常见错误和解决办法集锦
    查看>>
    Unable to determine local host from URL REPOSITORY_URL=http://
    查看>>
    ORACLE配置,修改tnsnames.ora文件实例
    查看>>
    Workstation服务无法启动导致无法访问文件服务器
    查看>>
    Linux常用命令(一)
    查看>>
    一个自动布署.net网站的bat批处理实例
    查看>>
    我的友情链接
    查看>>
    JS中比较数字大小
    查看>>