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

Xamarin android中使用signalr实现即时通讯 前面几天也写了一些signalr的例子,不过都是在Web端,今天我就来实践一下如何在xamarin android中使用signalr,刚好工作中也用到了这个,也算是总结一下学到的东西吧,希望能帮助你们,更快地熟悉使用xamarin android进行即时通讯。 先来看一下最终实现的效果: 这个简单的例子主要分为两部分: 1.一个Signalr web端提供访问的地址,也就是前面所写的例... 阅读详情

前言

目录:

用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>

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

我会坚持写完本系列..

SignalR完整源码 一款完整的SignalR前端和后端源码,此框架可以替代websocket,制作web以及客户端的聊天和消息推送的功能。 立即下载

相关推荐

asp.net mvc版本Signalr即时通讯完整源码

asp.net mvc版本Signalr即时通讯完整源码

C# SignalR 即时通讯 聊天室

一.SignalR简介 SignalR:当所连接的客户端变得可用时服务器代码可以立即向其推送内容,而不是让服务器等待客户端请求新的数据。实现实时服务器与客户端通信。是一个开源.NET 库生成需要实时用户交互或实时数据更新的 web 应用程序。 SignalR的出现,让页面通过javascript可以很简单的调用后端服务的方法,而在后端也可以很简单的直接调用javascript所实现的方法,前后...

weixin_30578677的博客 1013

.net core 2.1 signalr 点对点聊天实例

网上很少有直接使用的例子 自己找了点资料写了一个用,

vue中使用signalR总结(前端代码)

一、SignalR 是什么? ASP.NET SignalR 是一个面向 ASP.NET 开发人员的库,可简化将实时 web 功能添加到应用程序的过程。实时 web 功能是让服务器代码将内容推送到连接的客户端立即可用,而不是让服务器等待客户端请求新数据的能力。 SignalR 可用于将任何类型的"实时"web 功能添加到 ASP.NET 应用程序。尽管聊天通常用作示例,您可以更为很多。只...

weichaoya的博客 3万+

SignalR Winform服务端、客户端实现,附带web端调用Demo

SignalR Winform服务端、客户端实现,附带web端调用Demo。案例包含了永久连接以及集线器两种实现方式,以及web端调用、窗体程序下调用方式实现

blazorcam:WebRTC客户端和SignalR服务器用于P2P视频音频通话

WebRTC与Blazor WASM 我创建了这个项目,以作为WebRTC的参考,并作为基础项目的实现,以防将来的项目中需要它。 在HTML5之前,唯一的选择是使用Flash或Silverlight能够在Web上共享多媒体内容,这对我作为业余开发人员来说是禁止的。 WebRTC并不新鲜,但是比我上次做类似事情的尝试要新。 我从BlazorServer项目开始,因为我是C#的忠实拥护者,并且希望尽可能多地使用它,而不必在服务器端的C#和前端的Javascript之间切换。 但是,我发现WASM仍不支持某些功能,因此Blazor Server似乎是我的最佳方法。 通过创建一个空目录并运行以下命令来创建blazor服务器: dotnet new blazorserver 这将创建具有简单导航系统和一些示例页面的模板应用程序。 如果不需要,可以将其删除,以保持项目的清洁。 阅读了一些有

用SignalR 2.0开发客服系统[系列5:使用SignalR的中文简体语言包和其他技术点]

前言 目录: 用SignalR 2.0开发客服系统[系列1:实现群发通讯] 用SignalR 2.0开发客服系统[系列2:实现聊天室] 用SignalR 2.0开发客服系统[系列3:实现点对点通讯] 用SignalR 2.0开发客服系统[系列4:负载均衡的情况下使用SignalR] 以上是系列目录,终于到了结束的时候了.... 为了这个系列

双鱼达摩 3020

AD从原理图到PCB超详细教程

我在学习AD的时候,看了网上很多教程,但是东西很杂,有很多条理不清而且废话很多,所以相信大家学习的时候也是遇到一样的困难。我就特地写一篇帖子,整理了一下AD从画原理图开始一直到画完PCB文件的所有步骤,一方面是供大家参考学习,另一方面可以方便我自己学习记忆更加深刻。我用的版本是AD16中文版,大家用新的版本AD20或者AD22应该操作都是差不多的。

人生寂寞如雪 18万+

用SignalR 2.0开发客服系统[系列4:负载均衡的情况下使用SignalR]

前言 目录: 用SignalR 2.0开发客服系统[系列1:实现群发通讯] 用SignalR 2.0开发客服系统[系列2:实现聊天室] 用SignalR 2.0开发客服系统[系列3:实现点对点通讯] SignalR 2.0作为一个新的而且强大的通信工具,发布博客之后得到了很多人的支持,谢谢...也有人对性能和架设等问题提出了各种质疑..真的很感谢..

双鱼达摩 1682

倍福TwinCAT3 OPC UA配置全流程:从安装到无密码访问(附常见问题解决)

本文提供了倍福TwinCAT3 OPC UA配置的完整实战指南,重点讲解如何实现无密码游客访问。从软件安装、授权配置、服务器初始化到深度排错,详细解析了配置流程中的关键步骤与常见陷阱,帮助工程师高效打通PLC与上位系统的数据通讯通道。

vulkan6gpu的博客 472

WSL 运行make提示/lib/modules/xxx/build: No such file or directory. Stop.错误解决办法

WSL运行make提示/lib//modules/xxx文件或目录不存在。 WSL2的内核是修改过的,无法使用 ubuntu上游的内核头文件和modules文件,因此,我们需要手动编译并安装一个版本。

weixin_45668903的博客 1万+

SignalR 2.0 系列: SignalR 自托管主机

这是微软官方SignalR 2.0教程Getting Started with ASP.NET SignalR 2.0系列的翻译,这里是第六篇:SignalR 自托管主机 原文:SignalR Self-Host PS.前面的那篇在MVC5上使用SignalR跳过了……MVC5跟HTML的实现完全一样,只是将HTML的脚本放在View里面了,这里就跳过了。有兴趣的同学可以自己去看。 概述 ...

飞鹰的专栏 410

CentOS7下用FreeRADIUS+AD实现802.1X认证完整指南(附华为交换机配置)

本文提供了在CentOS 7系统上部署FreeRADIUS并与Windows Active Directory集成,以实现企业级802.1X网络认证的完整实战指南。内容涵盖从架构原理、服务器配置(包括Kerberos、Samba Winbind集成)、FreeRADIUS核心设置与AD联动,到华为交换机的详细配置步骤。重点解决了生产环境中常见的高可用、动态VLAN下发及深度排错问题,为企业构建集中、安全的网络准入控制体系提供了经过验证的解决方案。

weixin_29273849的博客 406

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

原文:用SignalR 2.0开发客服系统[系列1:实现群发通讯] 前言   先说一下我为什么会写这个博客吧,(首先说一下,我是一个小菜鸟,讲的不好请指导 - -,)    前段时间公司的项目涉及到在B/S上使用即时通讯,(其实就是做一个B/S的客服系统),当时公司很多大牛都说比较难搞,涉及到很多东西.   按照我的知识体系..因为之前做过C/S的即时通讯,基于Socket的..很麻烦...

weixin_33966095的博客 114

基于车牌识别的停车收费系统的设计与实现(源码+开题)

本系统(程序源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景: 随着城市化进程的加速和汽车保有量的增加,停车难成为了一个普遍存在的问题。传统的停车收费方式存在着效率低下、管理混乱等问题。因此,开发一款基于车牌识别的停车收费系统具有重要的现实意义。研究意义: 基于车牌识别的停车收费系统可以有效地解决传统停车收费方式在效率和准确性方面的问题,提高停车服务的效率和质量。

迟限程序设计 1392

基于STM32的便携式心率血氧监测系统 | 保姆式教程 开源可复刻

本项目基于STM32F103C8T6核心控制器,完整实现了便携式心率血氧监测系统的全功能开发,覆盖MAX30102光电传感器驱动、PPG信号处理、心率血氧解算算法、人机交互、数据存储、报警保护、低功耗管理等核心功能,全程采用无跳步保姆式教学,从硬件选型、接线、CubeMX配置、代码开发、调试优化全流程拆解,跟着步骤一步步操作,就能顺利完成项目复刻

ZhongWeiXiang9的博客 767
上一篇: 用SignalR 2.0开发客服系统[系列2:实现聊天室]
下一篇: 用SignalR 2.0开发客服系统[系列4:负载均衡的情况下使用SignalR]
双鱼达摩
博客等级 码龄18年 8粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值