asp.net网站作为websocket服务端的应用该如何写
最近被websocket的一个问题困扰了很久,有一个需求是在web网站中搭建websocket服务。客户端通过网页与服务器建立连接,然后服务器根据ip给客户端网页发送信息。
其实,这个需求并不难,只是刚开始对websocket的内容不太了解。上网搜索了一下,有通过asp.net core 实现的、有通过一般处理程序ashx文件来实现的,这些方法不能满足我当前网站的需求。我自己通过SignalR也实现了此功能,而且使用signalR实现起来会更简单。但是我的需求是客户端不是我编写,而且是一个手持机,只给我留了一个填写websocket服务器地址的地方,所以我没有办法通过signalR封装的js去调用后台的websocket服务。如果你的需求不像我这么苛刻,你完全可以通过signalR实现,而且更加简单。
最后,通过fleck第三方库实现了我想要的功能。下面详细说一下我的实现过程。
1.下载fleck第三方库,我是通过Git下载的,源码下载
点击页面中的Clone or download -> Download ZIP,下载

下载完之后,可以查看里面的文档,具体的实现可以查看代码。
2.将fleck加入到自己的项目中,并对fleck进行引用。

3.编写我们自己的websocket类
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Web;
using Fleck; namespace FAW.Common
{
public class WsContext
{
//客户端url以及其对应的Socket对象字典
static IDictionary<string, IWebSocketConnection> dic_Sockets = new Dictionary<string, IWebSocketConnection>(); public static void StartUpWs()
{
String ipValue = ConfigurationManager.AppSettings["WebsocketAddress"];
//创建
//WebSocketServer server = new WebSocketServer("ws://127.0.0.1:8819/terver");//监听所有的的地址
WebSocketServer server = new WebSocketServer(ipValue);//监听的地址写在配置文件里
//出错后进行重启
server.RestartAfterListenError = true; //开始监听
server.Start(socket =>
{
socket.OnOpen = () => //连接建立事件
{
//获取客户端网页的url
string clientUrl = socket.ConnectionInfo.ClientIpAddress + ":" + socket.ConnectionInfo.ClientPort;
dic_Sockets.Add(clientUrl, socket);
LogManager.WriteLog("服务器:和客户端网页:[" + clientUrl + "] 建立WebSock连接!");
};
socket.OnClose = () => //连接关闭事件
{
string clientUrl = socket.ConnectionInfo.ClientIpAddress + ":" + socket.ConnectionInfo.ClientPort;
//如果存在这个客户端,那么对这个socket进行移除
if (dic_Sockets.ContainsKey(clientUrl))
{
//注:Fleck中有释放
//关闭对象连接
if (dic_Sockets[clientUrl] != null)
{
dic_Sockets[clientUrl].Close();
}
dic_Sockets.Remove(clientUrl);
}
LogManager.WriteLog("服务器:和客户端网页:[" + clientUrl + "] 断开WebSock连接!");
};
socket.OnMessage = message => //接受客户端网页消息事件
{
string clientUrl = socket.ConnectionInfo.ClientIpAddress + ":" + socket.ConnectionInfo.ClientPort;
LogManager.WriteLog("服务器:【收到】来客户端网页:" + clientUrl + "的信息:\n" + message); };
}); } public static void SendMsg(String ipAddress, String jsonString)
{
if (String.IsNullOrEmpty(jsonString))
{
//写日志
LogManager.WriteLog("中止发送,向客户端发送信息为空。" );
return;
}
foreach (var item in dic_Sockets.Values)
{
if (item.IsAvailable == true && item.ConnectionInfo.ClientIpAddress == ipAddress)
{
LogManager.WriteLog("服务器: 向客户端发送信息为 " + jsonString);
item.Send(jsonString);
}
}
}
}
}
这段代码呢,StartUpWs函数主要是建立一个websocket服务端,SendMsg函数是负责提供外部调用向指定的客户端发送内容的工作。
try
{
String pdaIP = cameraLogic.QueryPDAIPByIP(cameraIP);
LogManager.WriteLog("获取摄像头对应的手机机IP:" + pdaIP);
WsContext.SendMsg(pdaIP, sendMessage);
}
catch (Exception ex)
{
LogManager.WriteLog("手动抬杆websocket异常:" + ex.Message);
}
这个代码片段就是在网站中调用SendMsg函数,给指定的客户端发送数据。
注意:这里要提一点,如果websocket服务的端口要提供给外网访问的话,需要将端口加入到防火墙入站规则中,并且需要做一下内外网ip和端口的映射,否则外网想访问这个服务是不可以的。
4.接下来我们就要将websocket添加到网站中,让它随着网站的启动而启动。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Routing;
using System.Web.Security;
using FAW.WEB;
using FAW.Common; namespace FAW.WEB
{
public class Global : HttpApplication
{
void Application_Start(object sender, EventArgs e)
{
// 在应用程序启动时运行的代码
AuthConfig.RegisterOpenAuth(); //建立websocket服务器
WsContext.StartUpWs();
} }
}
这样就可以了。
5.测试websocket服务是否可用的话,可以通过websocket在线测试的功能。这个只要百度一下,你就全知道了,很简单,这里不再介绍。
总结:其实websocket的操作真的不难,就是普通的http请求得到了一次升级后,建立了一个全双工的通道,可以相互发送信息。只是我在网上并没有找到asp.net网站作为服务端的例子,其实需要做的只有两步:1.建立一个websocket的服务端;2.将websocket的服务端加入到Global文件中,随程序一起启动。我把这个分享出来,希望可以帮助更多的人。
asp.net网站作为websocket服务端的应用该如何写的更多相关文章
- C# WebSocket 服务端示例代码 + HTML5客户端示例代码
WebSocket服务端 C#示例代码 using System; using System.Collections.Generic; using System.Linq; using System. ...
- nodejs搭建简单的websocket服务端
创建websocket服务端使用了nodejs-websocket ,首先要安装nodejs-websocket,在项目的目录下: npm install nodejs-websocket 1.搭建w ...
- WebSocket服务端
http://blog.csdn.net/qq_20282263/article/details/54310737 C# 实现WebSocket服务端 原创 2017年01月10日 09:22:50 ...
- 项目二:企业级java电商网站开发(服务端)
声明:项目源于网络,支持正版教程,学习使用,仅记录在此 项目介绍 企业级java电商网站开发(服务端),模块划分:用户管理,商品管理,商品品类管理,订单管理,订单详情管理,购物车管理,收货地址管理,支 ...
- 用nodejs快速实现websocket服务端(带SSL证书生成)
有不少公司将nodejs的socket.io作为websocket的解决方案,很遗憾的是socket.io是对websocket的封装,并不支持html5原始的websocket协议,微信小程序使用的 ...
- Netty 搭建 WebSocket 服务端
一.编码器.解码器 ... ... @Autowired private HttpRequestHandler httpRequestHandler; @Autowired private TextW ...
- VB6+Winsock编写的websocket服务端
早就写好了,看这方面资料比较少,索性贴出来.只是一个DEMO中的,没有做优化,代码比较草.由于没地方上传附件,所以只把一些主要的代码贴出来. 这只是服务端,不过客户端可以反推出来,其实了解了webso ...
- ASP.NET MVC+EF在服务端分页使用jqGrid以及jquery Datatables的注意事项
引言: 本人想自己个博客网站出来,技术路线是用ASN.NET MVC5+EF6(Code First)+ZUI+各种Jquery插件,有了这个想法之后就开始选择UI,看了好多bootstrap的模板之 ...
- .NET 即时通信,WebSocket服务端实例
即时通信常用手段 1.第三方平台 谷歌.腾讯 环信等多如牛毛,其中谷歌即时通信是免费的,但免费就是免费的并不好用.其他的一些第三方一般收费的,使用要则限流(1s/限制x条消息)要么则限制用户数. 但稳 ...
随机推荐
- [Other]THUWC2020 游记
Dec. 20th 一下飞机,\(\text{FJ}\) 选手感觉 \(\text{BJ}\) 好冷 下午去了鸟巢,晚上回 \(\text{GLHT}\) 酒店吃泡面 写了洛谷上的线段树分治模板题之后 ...
- 美食家App开发日记3
由于个人原因,感觉Android的学习特别复杂,初次接触,实在难以完成最初设想,所以将最初的设想做减法. 今天学习了ListView控件,将图片和美食名字使用ListView界面显示出来,并学习提升L ...
- (转) fuzzing XSS filter
//转自isno在wooyun知识库所写 题记:这是09年自己写的总结文章,之后多年也不搞这个了,技术显然是过时了,但我觉得思路还是有用的,算抛砖引玉吧,各位见笑 0x00 前言 这是一篇学习总结,首 ...
- Ubuntu下makefile的简单使用
在Windows下,只需要简单的点击以下make,rebuild即可.而在Linux下,这样的IDE环境并没有提供,难道必须每一步都执行一遍吗?比较ok的做法自然是能够利用批处理脚本来进行操作了,这样 ...
- php---> xhprof安装及使用
xhprof 简介 xhprof是一款网站的性能工具 安装(lnmp) php --ri xhprof #检查php是否有这个扩展 cd xhprof-0.9.4/xhprof-0.9.4/exten ...
- 基于快排思想的第(前)k大(小)
算法思路就是根据快排的partition,先随机选择一个分隔元素(或a[0]),将数组分为[小于a[p]的元素] a[p] [大于a[p]的元素],如果这时候n-p+1等于k的话,a[p]就是所求的第 ...
- python基础面试集锦(51-100)
目录 51.把aaabbbcccdd这种形式的字符串压缩成a3b3c3d2的形式? 52.给你一个字符串'abc',打印出该字符串的所有排列组合? 53.执行以下代码后,x的值为? 54.对于一个非空 ...
- AcWing 787.归并排序
AcWing 787.归并排序 题目描述 给定你一个长度为n的整数数列. 请你使用归并排序对这个数列按照从小到大进行排序. 并将排好序的数列按顺序输出. 输入格式 输入共两行,第一行包含整数 n. 第 ...
- OpenCV中Mat与二维数组之间的转换
---恢复内容开始--- 在OpenCV中将Mat(二维)与二维数组相对应,即将Mat中的每个像素值赋给一个二维数组. 全部代码如下: #include <iostream> #inclu ...
- 惠普电脑win10关闭自动调节亮度
自动调节亮度真的太烦人了,突然从亮的画面变暗,又从暗的亮度变量,眼睛受不了.但是试了很多种方法都不行. 方法 第一种: 有一些电脑是有在设置--->显示界面--->有一个 关闭自动调节 按 ...