初学SignalR使用总结-基于浏览器的在线聊天功能开发

最近闲来没事研究了一下在线聊天技术,发现微软一个比较好的东西(SignalR),该东西实现的效果感觉很了不起,可以通过程序去控制世界各个角落访问你网站的使用者浏览你的web页面,打破了浏览器的请求响应模式。
SignalR最典型的例子就是实现基于浏览器的在线聊天功能,SignalR是微软的东西,目前需要.net framework 4.5以上版本,本人使用vs2012基本满足,浏览器方面已经支持IE8及以上版本下面上代码:

首先让你的项目支持SignalR,打开vs2012工具菜单,选择库程序包管理器下面的管理net解决方案的nuget包菜单,联机搜索SignalR安装即可。
本人使用的.net MVC3版本。
安装完成后新建一个ChatHub类,SignalR关键类,代码如下:
using Microsoft.AspNet.SignalR;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Web;

namespace Kzrcw2014.MyClasses
{
public class SignalRHub:Hub
{
//声明静态变量存储当前在线用户
public static class UserHandler
{
public static Dictionary<string, string> ConnectedIds = new Dictionary<string, string>();
}

//用户进入页面时执行的(连接操作)
public void userConnected(string name)
{
//进行编码,防止XSS攻击
name = HttpUtility.HtmlEncode(name);
string message = "用户 " + name + " 登录";

//发送信息给其他人
Clients.Others.addList(Context.ConnectionId, name);
Clients.Others.hello(message);

//发送信息给自己,并显示上线清单
Clients.Caller.getList(UserHandler.ConnectedIds.Select(p => new { id = p.Key, name = p.Value }).ToList());

//新增目前使用者上线清单
UserHandler.ConnectedIds.Add(Context.ConnectionId, name);
}

//发送信息给所有人
public void sendAllMessage(string message)
{
message = HttpUtility.HtmlEncode(message);
var name = UserHandler.ConnectedIds.Where(p => p.Key == Context.ConnectionId).FirstOrDefault().Value;
message = name + "说:" + message;
Clients.All.sendAllMessge(message);
}

//发送信息给特定人
public void sendMessage(string ToId, string message)
{
message = HttpUtility.HtmlEncode(message);
var fromName = UserHandler.ConnectedIds.Where(p => p.Key == Context.ConnectionId).FirstOrDefault().Value;
message = fromName + " <span style='color:red'>悄悄对你说</span>:" + message;
Clients.Client(ToId).sendMessage(message);
}

//当使用者断线时执行
public override Task OnDisconnected()
{
//当使用者离开时,移除在清单内的ConnectionId
Clients.All.removeList(Context.ConnectionId);
UserHandler.ConnectedIds.Remove(Context.ConnectionId);
return base.OnDisconnected();
}
}
}
页面代码如下:
var userID = "";

$(function () {
//回车查询
var $inp = $('input:text');
$inp.bind('keydown', function (e) {
var key = e.which;
if (key == 13) {
$('#send').click();
}
});
userID = $("#UserName").val();
//建立與Server端的Hub的物件,注意Hub的開頭字母一定要為小寫
var chat = $.connection.chatHub;

//取得所有上線清單
chat.client.getList = function (userList) {
var li = "";
$.each(userList, function (index, data) {
li += "<li id='" + data.id + "'>" + data.name + "</li>";
});
$("#list").html(li);
}
//新增一筆上線人員
chat.client.addList = function (id, name) {
var li = "<li id='" + id + "'>" + name + "</li>";
$("#list").append(li);
}
//移除一筆上線人員
chat.client.removeList = function (id) {
$("#" + id).remove();
}

//全體聊天
chat.client.sendAllMessge = function (message) {
$("#messageList").append("<li>" + message + "</li>");
}

//密語聊天
chat.client.sendMessage = function (message) {
$("#messageList").append("<li>" + message + "</li>");
}

chat.client.hello = function (message) {
$("#messageList").append("<li>" + message + "</li");
}

//將連線打開
$.connection.hub.start().done(function () {
//當連線完成後,呼叫Server端的userConnected方法,並傳送使用者姓名給Server
chat.server.userConnected(userID);
});;

$("#send").click(function () {
var to = $("#box").val();
//當to為all代表全體聊天,否則為私密聊天
if (to == "all") {
chat.server.sendAllMessage($("#message").val());
} else {
chat.server.sendMessage(to, $("#message").val());
}
$("#message").val('');
});

$("#list li").live("click", function () {
var $this = $(this);
var id = $this.attr("id");
var text = $this.text();

//防止重複加入密語清單
if ($("#box").has("." + id).length > 0)
return false;
var option = "<option></option>"
$("#box").append(option).find("option:last").val(id).text(text).attr({ "selected": "selected" }).addClass(id);
});

});

</script>
<fieldset style="display:none">
<legend>系统使用交流及问题在线提交</legend>
<div id="messageBox">
<ul id="messageList"></ul>
</div>
<div id="chatList">
<p>当前在线</p>
<ul id="list">
</ul>
</div>
<div id="bar">
<div style="margin-top: 6px; float: left;">
<select id="box">
<option value="all">所有人</option>
</select>
</div>
<div style="margin: 5px; float: left;">

<input id="message" type="text" value="" />
</div>
<div style="margin: 5px; float: left;">
<input type="button" id="send" value="发 送" class="btn btn-success" />
</div>
</div>
<input type="hidden" id="UserName" value="@ViewBag.UserId"/>
</fieldset>
源码下载地址:http://www.kwstu.com/ResourcesView/SignalR_2014310111024681

转载于:https://www.cnblogs.com/wcLT/p/4790171.html

SignalR实现服务器与客户端的实时通信相关推荐

  1. SignalR 实现web浏览器客户端与服务端的推送功能

    SignalR 是一个集成的客户端与服务器库,基于浏览器的客户端和基于 ASP.NET 的服务器组件可以借助它来进行双向多步对话. 换句话说,该对话可不受限制地进行单个无状态请求/响应数据交换:它将继 ...

  2. 如何在ASP.NET Core中使用SignalR构建与Angular通信的实时通信应用程序

    图片 假设我们要创建一个监视Web应用程序,该应用程序为用户提供了一个能够显示一系列信息的仪表板,这些信息会随着时间的推移而更新. 第一种方法是在定义的时间间隔(轮询)定期调用API 以更新仪表板上的 ...

  3. signalr php,继SignalR 持久链接 Web客户端

    简单聊天程序 .container{background-color:#99CCFF;border:thick solid #808080;padding:20px;margin:20px; } Ec ...

  4. TCP协议的服务器与客户端的程序设计(代码注释超详细)

    在上篇博客中讲到了三次握手和四次挥手: Linux网络编程--TCP中的三次握手和四次挥手_神厨小福贵!的博客-CSDN博客服务器编程和客户端编程的大致流程如下:三次握手是在客户端中的connect中 ...

  5. ktor框架用到了netty吗_教你如何构建异步服务器和客户端的 Kotlin 框架 Ktor

    Ktor 是一个使用 Kotlin 以最小的成本快速创建 Web 应用程序的框架. Ktor 是一个用于在连接系统(connected systems)中构建异步服务器和客户端的 Kotlin 框架. ...

  6. 如何使用MSTSC命令远程连接服务器或客户端

    对于大多数普通管理员来说,大家应当都使用过"远程桌面连接"工具(如下图),通过此工具你可以进行一些最基本的设置(如:显示屏的大小,颜色,本地资源的使用,应用程序的运行等等.),来达 ...

  7. TCP服务器和客户端的链接例子(侧重点在注意关闭套接子,减少套接子的描述子)

    TCP服务器和客户端的链接例子(侧重点在注意关闭套接子,减少套接子的描述子) 每个文件或套接口都有一个访问计数,该访问计数在文件表项中维护,它表示当前指向该文件或套接口的打开的描述字个数. 每个文件, ...

  8. 使用python中的socket实现服务器和客户端,并完成图片的传输

    使用python中的socket实现服务器和客户端,并完成图片的传输. 2018年03月09日 16:05:23 阅读数:301 socket服务器代码: [python] view plaincop ...

  9. 【Java 网络编程】UDP 服务器 与 客户端持续交互 案例

    文章目录 I UDP 交互原理 II UDP 服务器端代码示例 III UDP 客户端代码示例 IV 服务器 客户端 运行结果 I UDP 交互原理 1. UDP 单播传输流程 : A 给 B 发送数 ...

最新文章

  1. 测试三相无刷电机驱动器 XXD2212 电调
  2. nohup和的区别与关系
  3. ansible+powershell DSC 可以管理windows server了
  4. c语言指针的自我评价,个人自我评价
  5. ArcGIS实验教程——实验四:数字化属性数据的采集
  6. docker php 乱码,如何解决docker安装zabbix5.0界面乱码
  7. ruby array_在Ruby中使用Array.pop和Array.shift方法从Array中删除元素
  8. php取整函数ceil,floor,round,intval的区别
  9. LightOJ 1410 Consistent Verdicts(找规律)
  10. Java语言String字符串课后作业
  11. Android 面试那些事儿
  12. 电脑监控软件都有哪些?
  13. 软件开发人员的能力模型
  14. 【android开发】手机应用管理器的实现之实现软件加锁(四)
  15. Java工程师成神之路~(2018修订版)
  16. sd卡数据恢复源码android,SD卡数据恢复非常简单,想学的看过来!
  17. linux 文本随机抽样_Linux命令总结
  18. 好分数班级等级C_2020高中分数线(广州|深圳|天津|广州|南宁|泉州|龙岩|武汉|沈阳|青岛|汉中|长春|四平|北京等)...
  19. Spine 实用技巧大全
  20. C++ - 求一个正整数的二进制表示中1的个数

热门文章

  1. 每天一个linux命令(50):crontab命令
  2. Java开发面试问题,牛逼轰轰!
  3. python中使用函数编程的意义_总结Python编程中函数的使用要点
  4. 如何一键部署php应用,我们怎样来使用宝塔面板一键部署安装博客程序ZBlogPHP
  5. python从入门到精通视频百度云资源_python从入门到精通视频(全60集)声音修复版...
  6. postgresql根据字符分割数据为多列
  7. 企业网络推广中用户行为到底能为企业网络推广带来多少影响?
  8. 网站优化有几个优化因素值得引起注意
  9. 新站SEO优化如何吸引搜索引擎蜘蛛的爬行?
  10. 网站外链优化需要注意哪些事项?