asp.net新建一个服务端程序,用来处理链接服务端:

1,新建一个处理程序 .ashx

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Web;
using System.Web.WebSockets;
using SFellowEntity.Models; namespace SchoolfellowCard.Handler
{
/// <summary>
/// WebSocketServer webSocket服务
/// </summary>
public class WebSocketServer : IHttpHandler
{
//用户连接池
private static Dictionary<string, WebSocket> connectPool = new Dictionary<string, WebSocket>();
//离线消息池
private static Dictionary<string, List<MessageInfo>> messagePool = new Dictionary<string, List<MessageInfo>>(); public void ProcessRequest(HttpContext context)
{
if (context.IsWebSocketRequest)
{
context.AcceptWebSocketRequest(ProcessChat);
}
}
/// <summary>
/// webSocket异步作业
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
private async Task ProcessChat(AspNetWebSocketContext context)
{
//WebSocket socket = context.WebSocket;
//while (true)
//{
// if (socket.State == WebSocketState.Open)
// {
// ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[2048]);
// WebSocketReceiveResult result = await socket.ReceiveAsync(buffer, CancellationToken.None);
// string userMsg = Encoding.UTF8.GetString(buffer.Array, 0, result.Count);
// userMsg = "你发送了:" + userMsg + "于" + DateTime.Now.ToLongTimeString();
// buffer = new ArraySegment<byte>(Encoding.UTF8.GetBytes(userMsg));
// await socket.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None);
// }
// else
// {
// break;
// }
//}
WebSocket socket = context.WebSocket;
string user =string.Format("{0}", context.QueryString["user"]); try
{
#region 验证用户添加连接池 //第一次open时,添加到连接池中
if (!connectPool.ContainsKey(user))
{
connectPool.Add(user, socket); //不存在,添加
}
else
{
if (socket != connectPool[user]) //当前对象不一致,更新
{
connectPool[user] = socket;
}
} #endregion #region 离线消息处理
if (messagePool.ContainsKey(user))
{
//TODO:离线消息可放入数据库在此获取离线消息并返回给对应的用户
List<MessageInfo> msgs = messagePool[user];
foreach (MessageInfo item in msgs)
{
await socket.SendAsync(item.MsgContent, WebSocketMessageType.Text, true, CancellationToken.None);
}
messagePool.Remove(user);//移除离线消息
//TODO:处理完后标记离线消息已推送
}
#endregion string descUser = string.Empty;//目的用户
while (true)
{
if (socket.State == WebSocketState.Open)
{
ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[2048]);
//websocket接收消息
WebSocketReceiveResult result = await socket.ReceiveAsync(buffer, CancellationToken.None); #region 消息处理(字符截取、消息转发)
try
{
#region 关闭Socket处理,删除连接池
if (socket.State != WebSocketState.Open)//连接关闭
{
if (connectPool.ContainsKey(user)) connectPool.Remove(user);//删除连接池
break;
}
#endregion string userMsg = Encoding.UTF8.GetString(buffer.Array, 0, result.Count);//发送过来的消息
string[] msgList = userMsg.Split('|');
if (msgList.Length == 2)
{
if (msgList[0].Trim().Length > 0)
descUser = msgList[0].Trim();//记录消息目的用户//TODO:将消息接收者可放入数据库存贮记录
buffer = new ArraySegment<byte>(Encoding.UTF8.GetBytes(msgList[1]));
}
else
buffer = new ArraySegment<byte>(Encoding.UTF8.GetBytes(userMsg)); if (connectPool.ContainsKey(descUser))//判断客户端是否在线
{
WebSocket destSocket = connectPool[descUser];//目的客户端
if (destSocket != null && destSocket.State == WebSocketState.Open)
await destSocket.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None);
}
else
{
Task.Run(() =>
{
if (!messagePool.ContainsKey(descUser))//将用户添加至离线消息池中
messagePool.Add(descUser, new List<MessageInfo>());
messagePool[descUser].Add(new MessageInfo(DateTime.Now, buffer));//添加离线消息
//TODO:离线消息插入数据库
});
}
}
catch (Exception exs)
{
//消息转发异常处理,本次消息忽略 继续监听接下来的消息
}
#endregion
}
else
{
break;
}
}//while end
}
catch (Exception ex)
{
//整体异常处理
if (connectPool.ContainsKey(user)) connectPool.Remove(user);
}
} public bool IsReusable
{
get
{
return false;
}
}
}
}

其中,MessageInfo.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace SFellowEntity.Models
{
/// <summary>
/// 消息
/// </summary>
public class MessageInfo
{
/// <summary>
/// 消息内容
/// </summary>
public ArraySegment<byte> MsgContent { get; set; }
/// <summary>
/// 消息时间
/// </summary>
public DateTime MsgTime { get; set; }
/// <summary>
/// 构造函数
/// </summary>
/// <param name="msgTime"></param>
/// <param name="msgContent"></param>
public MessageInfo(DateTime msgTime, ArraySegment<byte> msgContent)
{
MsgTime = msgTime;
MsgContent = msgContent;
}
}
}

页面端:

2,页面JavaScript创建WebSocket对象,并发起连接

            $('#conn').click(function () {
ws = new WebSocket('ws://' + window.location.hostname + ':' + window.location.port + '/Handler/WebSocketServer.ashx?user=' + $("#user").val());
$('#msg').append('<p>正在连接</p>'); ws.onopen = function () {
$('#msg').append('<p>已经连接</p>');
}
ws.onmessage = function (evt) {
$('#msg').append('<p>' + evt.data + '</p>');
}
ws.onerror = function (evt) {
$('#msg').append('<p>' + JSON.stringify(evt) + '</p>');
}
ws.onclose = function () {
$('#msg').append('<p>已经关闭</p>');
}
}); $('#close').click(function () {
ws.close();
}); $('#send').click(function () {
if (ws.readyState == WebSocket.OPEN) {
ws.send($("#to").val() + "|" + $('#content').val());
}
else {
$('#tips').text('连接已经关闭');
}
});

WebSocket,IsWebSocketRequest与AspNetWebSocketContext的更多相关文章

  1. .net使用websocket

    专业挖坑21年     1.前 言 网上找了很多资料,可能是自己找的路子不对吧,都找不到适合我这样萌新的文章,大多.net环境使用的websocket都是在说一个通信的案例,学起来的确很吃力,自己也挖 ...

  2. websocket在.net4.5中实现的简单demo

    以下代码环境要求:win8或win10, .net4.5+IIS8 win7上是IIS7,win7上.net本身不直接支持websocket, win7可以用superwebsocket, 或自己根据 ...

  3. WebSocket在ASP.NET MVC4中的简单实现 (该文章转自网络,经尝试并未实现,请大神指点。)

    WebSocket 规范的目标是在浏览器中实现和服务器端双向通信.双向通信可以拓展浏览器上的应用类型,例如实时的数据推送.游戏.聊天等.有了WebSocket,我们就可以通过持久的浏览器和服务器的连接 ...

  4. WebSocket在ASP.NET MVC4中的简单实现

    WebSocket在ASP.NET MVC4中的简单实现 2013-12-21 20:48 by 小白哥哥, 810 阅读, 3 评论, 收藏, 编辑 WebSocket 规范的目标是在浏览器中实现和 ...

  5. HTTP协议系列(3)---包括WebSocket简单介绍

    一.HTTPS     HTTP是超文本传输协议,那HTTPS是什么尼?要明白HTTPS是什么先要明白HTTP的缺点,想一下我们在使用HTTP的时候会有那些缺点尼? 1.通信使用的明文(不加密),内容 ...

  6. .NET 即时通信,WebSocket服务端实例

    即时通信常用手段 1.第三方平台 谷歌.腾讯 环信等多如牛毛,其中谷歌即时通信是免费的,但免费就是免费的并不好用.其他的一些第三方一般收费的,使用要则限流(1s/限制x条消息)要么则限制用户数. 但稳 ...

  7. 第一节:.Net版基于WebSocket的聊天室样例

    一. 说在前面的话 该篇文章为实时通讯系列的第一节,基于WebSocket编写了一个简易版聊天样例,主要作用是为引出后面SignalR系列的用法及其强大方便之处,通过这个样例与后续的SignalR对比 ...

  8. 【WebSocket No.3】使用WebSocket协议来做服务器

    写在开始 上面一篇写了一篇使用WebSocket做客户端,然后服务端是socke代码实现的.传送门:webSocket和Socket实现聊天群发 本来我是打算写到一章上的,毕竟实现的都是一样的功能,后 ...

  9. Asp.net+WebSocket+Emgucv实时人脸识别

    上个月在网上看到一个用web实现简单AR效果的文章,然后自己一路折腾,最后折腾出来一个 Asp.net+WebSocket+Emgucv实时人脸识别的东西,网上也有不少相关资料,有用winform的也 ...

  10. WebSocket简单尝试

    System.Net.WebSockets.WebSocket 需要.NET 4.5,IIS8以上,Windows Server2008R2自带的IIS不支持,Windows8及Server2012以 ...

随机推荐

  1. PostgreSQL模拟Oracle dba_objects

    PostgreSQL模拟Oracle dba_objects查询出schema下所有的用户自定义对象 创建测试数据 psql -U postgres create user test password ...

  2. 想要硬件设计不用愁?首先要搞懂这三类GPIO!

    合宙低功耗4G模组经典型号Air780E,支持两种软件开发方式: 一种是传统的AT指令:一种是基于模组做Open开发. 传统AT指令的开发方式,合宙模组与行业内其它模组品牌在软件上区别不大,在硬件功耗 ...

  3. linux系统查看日志方法

    linux查看日志可以使用tail.cat.less.grep等实现,linux系统的日志通常是存在/var/log中 1.使用cat命令:cat /var/log,log目录下还有多种类型的日志文件 ...

  4. 【一步步开发AI运动小程序】十三、自定义一个运动分析器,实现计时计数02

    随着人工智能技术的不断发展,阿里体育等IT大厂,推出的"乐动力"."天天跳绳"AI运动APP,让云上运动会.线上运动会.健身打卡.AI体育指导等概念空前火热.那 ...

  5. 基于python的文件监控watchdog

    实时监控第三方库watchdog,其原理通过操作系统的时间触发的,不需要循环和等待 使用场景: 1.监控文件系统中文件或目录的增删改情况 2.当特定的文件被创建,删除,修改,移动时执行相应的任务 1. ...

  6. OSG开发笔记(三十六):osg3.4.0基于windows平台msvc2017x64编译器编译并移植Demo

    前言   本篇编译osg3.4.0的msvc2017x64版本,之前使用的都是mingw32版本.   OSG编译 步骤一:下载解压   下载3.4.0版本.   步骤二:使用cmake配置      ...

  7. 移动端NES网页模拟器(3)

    前言 前面2个章节已经封装好了摇杆和NES虚拟按键,现在配合jsnes这个包来完成一个移动端版的NES模拟器. 这是插件的github地址:bfirsh/jsnes 这个包可以直接拿来用,但是没有适配 ...

  8. Node.js 文件读写

    1.fs模块 在node.js中,所有文件的操作都是通过fs模块来实现的.包括文件目录的创建,删除,查询以及文件的读取,写入. 在fs模块中,所有的方法都分成同步和异步两种实现,具有sync后缀的为同 ...

  9. Datadog发布云成本现状报告:83%的容器支出被闲置资源浪费

    原文链接:https://www.datadoghq.com/state-of-cloud-costs/ 编译:CloudPilot AI 尽管灵活多样的云服务为云成本优化提供了诸多机会,但企业在提升 ...

  10. 搭建 zerotier 的行星服务

    放弃moon节点,直接搭建Zerotier根服务器_软件应用_什么值得买 Zerotier的优点在于其部署十分简便,只需在zerotier官网注册登陆并创建网络,在自己的设备安装客户端加入网络后,ze ...