html5+js+.Net的即时多人聊天
今天看了下websocket的知识,了解到这是html5新增的特性,主要用于实时web的通信。之前客户端获取服务端的数据,是通过客户端发出请求,服务端进行响应的模式,或者通过ajax每隔一段时间从后台发出请求,然后更新页面的信息,这种轮询的方式使得用户感觉页面是“实时响应”的,这样做虽然简单但未免有些暴力,另外每次请求都会有TCP三次握手并且附带了http头信息,服务器表示压力很大,这就造成了性能上和延迟的问题。
后来的技术方案中又出现了长轮询、Comet、浏览器插件(flash)和Java等来实现服务器往客户端推送消息,但都有一些弊端。
WebSocket的出现,意味着另一种解决方案,其提供了基于TCP的双向的、全双工(发送数据的同时也能够接受数据,两者同步进行)的socket连接。使用websocket,一旦服务端和客户端之间完成握手,信息就可以随意往来两端,而不用附件那些无用的http头信息,降低了带宽的占用,提高了性能,降低了延时。但其缺陷是浏览器的支持不够,比如IE,到了IE10才支持。
现在就通过一个简单的例子来讲讲其运用过程,先上下效果图:

项目的环境:.NET 4.5 +MVC 4 +JQuery+HTML5+VS2013+IE11
核心的实现过程,分以下几步:
1、websocket的创建、发送消息、接受消息、关闭
2、服务端的响应
下面针对上面的步骤,具体讲解下:
1、websocket的创建、发送消息、接受消息、关闭
websocket里包含的几个重要事件如下图: onopen onmessage onerror onclose;

websocket的创建: 这时连接会发送到服务端后台代码,进行客户端和服务端的握手,如果握手成功,则会触发onopen事件,表示连接建立;如果连接失败,就会执行onerror事件,随后执行onclose事件。当客户端获取到服务端推送的消息后,就会执行onmessage事件。
try{
if ("WebSocket" in window) { //判断浏览器是否支持WebSocket
socket = new WebSocket("ws://localhost:13458/Socket/SocketHandler.ashx"); //socket连接服务端地址
}
}
catch(ex)
{
log("您的浏览器不支持WebSocket,请切换到更高版本 或用chrome firefox");
return;
}
//相应的socket事件
//socket建立连接
socket.onopen = function () {
//连接成功,将消息广播出去
isSocketConnect = true;
$("#btnWs").val("断开");
sendSocketMessage(Event,"进入聊天室");
}
//socket得到服务端广播的消息
socket.onmessage = function (event) {
Log(event.data);
}
//socket连接关闭
socket.onclose = function () {
Log("socket closed!");
}
//socket连接出现错误
socket.onerror = function (event) {
Log("socket connect error");
}
当然客户端也可以往服务端发送消息,发送事件便是socket.send(data);data代表发送给服务端的数据:具体代码如下
if (socket.readyState == WebSocket.OPEN) {
if ($("#txtMsg").val() == "") {
if (!msg) {
return; //空文本不发送消息
}
}
//如果未输入用户名,根据当前时间生成游客昵称
if ($("#userName").val() == "") {
var d = new Date();
$("#userName").val("游客" + d.getMinutes() + "_" + d.getSeconds() + "_" + d.getMilliseconds());
}
if (!msg) {
msg = "" + $("#userName").val() + ":" + "<div class='divChat'>" + $("#txtMsg").val() + "</div>";
}
else {
msg = "" + $("#userName").val() + " " + msg;
}
socket.send(msg);
$("#txtMsg").val(""); //清空已输入的数据
$("#txtMsg").focus();
}
2、服务端的响应
这里我们添加一般处理程序来进行响应和推送客户端消息,其中有一点要处理的是 我们要实现即时多人聊天,就要把客户端发过来的消息广播到其他客户端,这里实现原理也很简单,就是把所有的连接用list存起来,然后遍历list集合,将消息发送给各个客户端。具体实现代码如下:
public class SocketHandler : IHttpHandler
{
//用来存储当前所有连接的客户单
public static List<WebSocket> WebSocketList;
public void ProcessRequest(HttpContext context)
{
if (WebSocketList == null)
{
WebSocketList = new List<WebSocket>();
}
HttpContext.Current.AcceptWebSocketRequest(async (contexts) =>
{
WebSocket socket = contexts.WebSocket;
while (true)
{
ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[1024]);
CancellationToken token;
WebSocketReceiveResult result = await socket.ReceiveAsync(buffer, token);
//获取客户端发过来的消息
string clientMessage = Encoding.UTF8.GetString(buffer.Array, 0, result.Count); if (socket.State == WebSocketState.Open)
{
//重新组织消息,发送给客户端
clientMessage = DateTime.Now.ToString() + " " + clientMessage;
buffer = new ArraySegment<byte>(Encoding.UTF8.GetBytes(clientMessage));
//如果该客户端为初次加入,添加到用户列表;
if (!WebSocketList.Contains(socket))
{
WebSocketList.Add(socket);
}
//将消息进行广播
foreach (WebSocket item in WebSocketList)
{
await item.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None);
}
}
if (socket.State == WebSocketState.CloseReceived)
{
//客户断开的时候,要从列表中移除
WebSocketList.Remove(socket);
}
}
});
}
参考资料:使用 HTML5 WebSocket 构建实时 Web 应用
ps:离职了,找工作中……广州/深圳 围观简历
喜欢就动动手指支持下!您的支持是我最大动力!
html5+js+.Net的即时多人聊天的更多相关文章
- 使用node.js实现多人聊天室(socket.io、B/S)
通过B/S架构实现多人聊天,客户端连接服务器,发送信息,服务器接收信息之后返回给客户端. 主要是通过socket.io实现浏览器和服务器之间进行实时,双向和基于事件的通信. socket.io官方文档 ...
- 使用 HTML5 webSocket API实现即时通讯的功能
project下载地址:http://download.csdn.net/detail/wangshuxuncom/6430191 说明: 本project用于展示怎样使用 HTML5 webSock ...
- SignalR 实现Web多人聊天室
ASP .NET SignalR 是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信.什么是实时通信的Web呢?就是让客户端(Web页面)和服务器端可以互相通知消 ...
- Html5+js测试题(开发版)
------------------------------------------------ 1. 谈谈你对js闭包的理解: 使用闭包主要是为了设计私有的方法和变量.闭包的优点是可以避免全局变量的 ...
- Html5+js测试题【完整版】
一.闭包的理解:使用闭包主要是为了设计私有的方法和变量.闭包的优点是可以避免全局变量的污染,缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露.闭包三个特性: 1.函数嵌套函数 ; 2 ...
- android asmack 注册 登陆 聊天 多人聊天室 文件传输
XMPP协议简介 XMPP协议(Extensible Messaging and PresenceProtocol,可扩展消息处理现场协议)是一种基于XML的协议,目的是为了解决及时通信标准而提出来的 ...
- Spring整合DWR comet 实现无刷新 多人聊天室
用dwr的comet(推)来实现简单的无刷新多人聊天室,comet是长连接的一种.通常我们要实现无刷新,一般会使用到Ajax.Ajax 应用程序可以使用两种基本的方法解决这一问题:一种方法是浏览器每隔 ...
- 只要三步,使用html5+js实现像素风头像生成器
只要三步,使用html5+js实现像素风头像生成器 html5的画布给我们带来了很大的空间,其实像素风格头像生成器只是用到了画方块的方法.画一个像素头像,只要三步,1.解决像素点,2.解决像素点之间的 ...
- [Web][高中同学毕业分布去向网站+服务器上挂载]二、敲定思路与方向(HTML5+JS(JQuery+ECharts))
高中同学毕业分布网站:敲定思路 一.背景 第一集:http://www.cnblogs.com/Twobox/p/8368121.html 中大体确定了自己的 大体目标.大体思路. 但是 . 在今天的 ...
随机推荐
- Gym 101201F Illumination (Two-Sat)
题意:一个n*n的房子,有很多灯,每个格子只能被上下方向照一次.左右方向照一次,每个灯可以选择上下或是左右照,照明长度以自身位置为中心,占用2*r+1个格子.问能否安排一种方案,使所有格子满足条件. ...
- 课堂限时训练-简易计算器·mini dc
课堂限时训练-简易计算器·mini dc 实验题目 采用后缀表达式法,设计一个建议计算器,实现+.-.*./四种运算. 代码实现 码云链接 关键代码部分及结果如下: 实验分析 首先,分析一下后缀表达式 ...
- C的打印输出格式
#include<stdio.h> int main() { float test1=12.3224356546565461-0.1; int test2=13; char test3[] ...
- (2)-生成JSONObject的方法
生成JSONObject一般有两种方式,通过javabean或者map类型来生成.如下面的例子: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 2 ...
- Using Load-Balancers with Oracle E-Business Suite Release 12 (Doc ID 380489.1)
Using Load-Balancers with Oracle E-Business Suite Release 12 (Doc ID 380489.1) Modified: 12-Jun-20 ...
- Java和.net对比分析
.Net和Java是国内市场占有率最高的两门技术,对于准备学习编程语言的初学者来说,.Net和Java是初学者首先考虑的两门技术,因此很多人一遍遍的问“学.Net还是学Java”,社区中也每天都有“. ...
- JKS与P12证书互转
keytool -importkeystore -srckeystore cacerts -srcstoretype JKS -deststoretype PKCS12 -destkeystore k ...
- 疑难杂症--在Windows Server 2008 R2上运行SQL Server 2008情况下,CPU过多导致的问题
64位的Windows7和Windows Server 2008 R2为了能够在一台机器上,支持超过64个逻辑CPU, 引入了Processor Group这个概念.Processor Group会把 ...
- centos 下wps 与goland 不能输入中文的解决办法
输入法:CentOS7自带ibus,如果你用的是fcitx请在对应的地方进行修改 系统:CentOS7,这个方案应该适用于大多数Linux发行版本 intelliJ goland中文输入法问题解决 首 ...
- SQL 从数据库中随机取n条数据
用NEWID()方法. * ,NEWID() AS random from [toblename] order by random 其中的1可以换成其他任意整数,表示取的数据条数