第一篇已经介绍了一大半了,下面就是详细业务了,其实业务部分要注意的地方有几个,剩下的就是js跟html互动处理。

首先在强调一下,页面上不可缺少的js:jquery,singalR.js,hubs .

 <script src="Scripts/jquery-1.10.2.min.js"></script>
<script src="Scripts/jquery.signalR-2.1.2.min.js"></script>
<script src="http://localhost:40716/push/im/hubs"></script>
  • 用户信息存储方式

    • 我采用的是利用localStorge存储到本地,当用户下次再进入聊天室,默认读取localStorge内的用户信息,信息格式如下:
  • 用户信息生成
    • 主要用Math.random()生成随机数,然后选择相应的图片和昵称就可以了,然后用户id随机生成一个,因为是demo,所以细节没考虑很多。
    • 核心代码:
    •  //获取用户信息
      function getUserIdAndName() { var user = {
      username: '', userphoto: '', userid: ''
      };
      var userstr = local.get("currentUser");
      if (!userstr) {
      //随机生成索引,对应头像
      var index = getRandom(1);
      //当前用户名
      user.username = username[index];
      //默认用户头像
      user.userphoto = '/photos/00' + index + '.jpg';
      //当前用户Id,用随机数法生成
      user.userid = getRandom(7); var userstr = JSON.stringify(user);
      local.set("currentUser", userstr);
      } else {
      user = JSON.parse(userstr);
      }
      return user;
      }
  • 实现用户加入消息推送
    • 当有新用户加入聊天室的时候,调用后台Hub的Join方法,将用户信息推送到当前所有进入聊天室的用户
    •    //初始化聊天室固定写法
      $.connection.hub.start({ jsonp: true }).done(function () {
      console.log("连接服务器成功");
      //调用join方法,实现当前用户加入信息推送
      proxy.server.join({
      photo: user.userphoto,
      username: user.username
      });
      }).fail(function () { console.log("聊天室初始化失败!"); });
    •         public Task Join(ZjMessage message)
      {
      message.connectionId = Context.ConnectionId;
      //就是用户加入的时候
      return Clients.All.receiveMessage(new { type = "join", msg = message });
      }
  • 历史消息读取
    • 历史消息读取可以放在连接服务器成功之后,也可以在hub.start().done(function(){ //})里面调用。连接服务器成功之后,会走Hub OnConnected方法,同理将历史消息读取出,然后推送给前端即可。读取方法,读者可以自行定义。我这里是正好结合了MongoDB练手,所以就采用了MongoDB读取。
    •  public override async Task OnConnected()
      {
      try
      {
      //用户第一次进来,读取历史记录
      var result = await query.GetListAsync(x => x.userid.Length > );
      Clients.Caller.receiveHistoryMessage(new { type = "system", msg = "您已经进入聊天室", oldlist = result.ToList() });
      }
      catch (TimeoutException ex)
      { }
      }
  • 结合界面
    • 前面几点都是消息推送,那么如何实现界面展示呢,很简单,json格式的数据已经传送回来了,要做的就是数据绑定了,可以用angular,jsrender,knockout等等各种数据绑定的js框架或者自己写也好,绑定到页面上即可。这里强调的一点是,根据消息推送的userid判断是否是自己发送的消息,然后添加 other 或 self 类名确定消息是在左边还是右边。绑定代码不在粘贴

上述的运行效果如图:

代码会在下期贴出来,下期预告:发送聊天信息和开发注意事项,聊天室总结以及代码下载。

ASP.NET SingalR + MongoDB 实现简单聊天室(二):实现用户信息、聊天室初始化,聊天信息展示完善的更多相关文章

  1. ASP.NET SingalR + MongoDB 实现简单聊天室(一):搭建基本框架

    ASP.NET SingalR不多介绍.让我介绍不如看官网,我这里就是直接上源代码,当然代码还是写的比较简单的,考虑的也少,希望各位技友多多提意见. 先简单介绍聊天室功能: 用户加入聊天室,自动给用户 ...

  2. ASP.NET SingalR + MongoDB 实现简单聊天室(三):实现用户群聊,总结完善

    前两篇已经介绍的差不多了,本篇就作为收尾. 使用hub方法初始化聊天室的基本步骤和注意事项 首先确保页面已经引用了jquery和singalR.js还有对应的hubs文件,注意,MVC框架有时会将jq ...

  3. Asp.NET MVC 使用 SignalR 实现推送功能二(Hubs 在线聊天室 获取保存用户信息)

    简单介绍 关于SignalR的简单实用 请参考 Asp.NET MVC 使用 SignalR 实现推送功能一(Hubs 在线聊天室) 在上一篇中,我们只是介绍了简单的消息推送,今天我们来修改一下,实现 ...

  4. 关于MongoDB的简单理解(二)--Java篇

    一.声明 本文依赖于 MongoDB JVM DRIVERS 4.1 版本编写. 本文案例依赖于 Maven 项目管理工具. 二.本文主要讲解哪些内容? 如何连接到MongoDB 通过TLS/SSL连 ...

  5. Node教程——Node+MongoDB案例实现用户信息的增删改查

    想要获取源代码的同学可以留言,我不做git上传了,案例太简单 没必要 综合演练 用户信息的增删改查 需求:你需要实现这样的结果 点击添加可以添加用户,点击删除可以删除点击修改可以修改 代码分析: 1. ...

  6. 使用ASP.NET SignalR实现一个简单的聊天室

    前言 距离我写上一篇博客已经又过了一年半载了,时间过得很快,一眨眼,就把人变得沧桑了许多.青春是短暂的,知识是无限的.要用短暂的青春,去学无穷无尽的知识,及时当勉励,岁月不待人.今天写个随笔小结记录一 ...

  7. 转载 ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(三) 激动人心的时刻到啦,实现1v1聊天

    ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(三) 激动人心的时刻到啦,实现1v1聊天   看起来挺简单,细节还是很多的,好,接上一篇,我们已经成功连接singalR服务器 ...

  8. 转载 ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(一) 整理基础数据

    ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(一) 整理基础数据   最近碰巧发现一款比较好的Web即时通讯前端组件,layim,百度关键字即可,我下面要做的就是基于这个前 ...

  9. ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(二) 实现聊天室连接

    上一篇已经简单介绍了layim WebUI即时通讯组件和获取数据的后台方法.现在要讨论的是SingalR的内容,之前都是直接贴代码.那么在贴代码之前先分析一下业务模型,顺便简单讲一下SingalR里的 ...

随机推荐

  1. asfda

    从事前端的朋友应该对"字体图标"这个词汇不陌生,为了适应越来越挑剔的屏幕,网页图标和简单图案使用.png来搭建已经基本上被淘汰了.取而代之的是使用css3和svg来绘制,而对于网页 ...

  2. MemcacheHelper.cs

    using Memcached.ClientLibrary; using System; using System.Collections.Generic; using System.Linq; us ...

  3. 2017年11月20日 WinForm窗体 窗口无边框可移动&&窗口阴影 控制窗口关闭/最小化

    弹框 MessageBox.Show(); 清空 clear() 字符串拼接 string 公共控件 button 按钮 checkbox 复选框 checklistbox 多个复选框 combobo ...

  4. Cheatsheet: 2017 05.01 ~05.31

    Web Configuring Your .npmrc for an Optimal Node.js Environment Web Developer Security Checklist HTTP ...

  5. Java 线程--实现java.lang.Runnable接口实现线程

    Java线程的第一种实现方式,主要分两步,第一步是继承java.lang.Thread; 第二步是重写run()方法.接下来我们来看Java线程的第二种实现方式,也是分为两步,第一步,写一个类实现ja ...

  6. https、公钥、私钥白话解说

    原文 摘要:本文尝试一步步还原HTTPS的设计过程,以理解为什么HTTPS最终会是这副模样.但是这并不代表HTTPS的真实设计过程.在阅读本文时,你可以尝试放下已有的对HTTPS的理解,这样更利于“还 ...

  7. Java内存溢出定位和解决方案(new)

    引起内存溢出的原因有很多种,列举一下常见的有以下几种: 1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据:2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收:3.代码中存在死循环 ...

  8. 回溯法最优装载问题(java)

    1.问题描述:      有一批共有 n 个集装箱要装上两艘载重量分别为 c1 和 c2 的轮船,其中集装箱 i 的重量为 w[i], 且重量之和小于(c1 + c2).装载问题要求确定是否存在一个合 ...

  9. Qt 资料大全

    https://blog.csdn.net/liang19890820/article/details/51752029 简述 发福利了.发福利了.发福利了,重要的事情说三遍... 为了方便更多Qte ...

  10. angularJS web应用SEO

    javascript给网站带来丰富的用户体验,越来越多的网站开始应用angularjs/emberjs这类MVC来开发web应用,可以说能够使用native方式来看法的手机app基本都可以使用替代的j ...