WebSocket服务器(物联网下行通知神器)

HttpServer是一个轻量级Web服务器,用于在嵌入式设备以及客户端环境中提供简单Web服务,同时也支持标准WebSocket服务。

本文例程基于vs2022,基础例程可参考:https://www.yuque.com/smartstone/nx/httpserver

WebSocket服务端

WebSocket服务端功能由HttpServer提供,只是映射到WebSocket特有的处理器上。

vs2022新建.NET6.0控制台项目,Nuget引用 NewLife.Core,使用以下例程:

using NewLife.Http;
using NewLife.Log;
using System;XTrace.UseConsole();var server = new HttpServer
{Port = 8080,Log = XTrace.Log,SessionLog = XTrace.Log
};
server.Map("/ws", new MyWebSocket());
server.Start();Console.ReadLine();class MyWebSocket : IHttpHandler
{/// <summary>处理请求</summary>/// <param name="context"></param>public virtual void ProcessRequest(IHttpContext context){var ws = context.WebSocket;ws.Handler = ProcessMessage;var source = new CancellationTokenSource();Task.Run(() => consumeMessage(ws, "nodeCode", source));WriteLog("WebSocket连接 {0}", context.Connection.Remote);}/// <summary>处理消息</summary>/// <param name="socket"></param>/// <param name="message"></param>public virtual void ProcessMessage(WebSocket socket, WebSocketMessage message){var remote = socket.Context.Connection.Remote;var msg = message.Payload?.ToStr();switch (message.Type){case WebSocketMessageType.Text:WriteLog("WebSocket收到[{0}] {1}", message.Type, msg);// 群发所有客户端socket.SendAll($"[{remote}]说,{msg}");break;case WebSocketMessageType.Close:WriteLog("WebSocket关闭[{0}] [{1}] {2}", remote, message.CloseStatus, message.StatusDescription);break;case WebSocketMessageType.Ping:case WebSocketMessageType.Pong:WriteLog("WebSocket心跳[{0}] {1}", message.Type, msg);break;default:WriteLog("WebSocket收到[{0}] {1}", message.Type, msg);break;}}private void WriteLog(String format, params Object[] args) => XTrace.WriteLine(format, args);
}

映射路由/ws到一个自定义处理器MyWebSocket上,该处理器包括了 ProcessRequest 和 ProcessMessage 。

  • ProcessRequest。收到WebSocket请求时触发一次,此时可验证访问者是否合法,例如借助JWT等Token技术。Handler属性设置为ProcessMessage,用于处理后续WebSocket消息。

  • ProcessMessage。建立WebSocket握手后,每次收到WebSocket消息(数据帧),都将调用该方法,包括二进制、文本、心跳和断开等多种消息类型。

  • Send。发送消息给客户端。

  • SendAll。群发消息给所有客户端。

  • Close。关闭连接。

跑起来:

可以看到,仍然是普通HttpServer监听8080端口。保持打开,不要关闭,下面客户端测试需要用到

WebClient客户端

借助.NET自身的ClientWebSocket,可以轻松构建WebSocket通信。

vs2022新建.NET6.0控制台项目,Nuget引用 NewLife.Core,使用以下例程:

using NewLife;
using NewLife.Data;
using NewLife.Log;
using System;
using System.Net.WebSockets;XTrace.UseConsole();var client = new ClientWebSocket();
await client.ConnectAsync(new Uri("ws://127.0.0.1:8080/ws"), default);
await client.SendAsync("Hello NewLife".GetBytes(), WebSocketMessageType.Text, true, default);var buf = new Byte[1024];
var rs = await client.ReceiveAsync(buf, default);
XTrace.WriteLine(new Packet(buf, 0, rs.Count).ToStr());await client.CloseAsync(WebSocketCloseStatus.NormalClosure, "通信完成", default);
XTrace.WriteLine("Close [{0}] {1}", client.CloseStatus, client.CloseStatusDescription);Console.ReadLine();

建立到服务端的连接后,向服务端发送字符串“Hello NewLife”,然后使用1024缓冲区接收一次响应数据,接着友好断开连接。

跑起来:

查看服务端:

可以看到,服务端ProcessRequest收到了客户端的WebSocket连接请求。两次ProcessMessage,第一次收到Text数据帧,也就是文本“Hello NewLife”,第二次是Close数据帧。

客户端也收到了服务端SendAll群发的数据,感兴趣的同学可以多开几个客户端试试。

物联网平台中使用

在物联网平台中,设备与服务端建立WebSocket长连接后,可以实时下发通知。

我们使用消息队列架构,如果队列中有消息,则通过WebSocket推给设备端。

消息大循环结合WebSocket如下:

    private async Task consumeMessage(WebSocket socket, String node, CancellationTokenSource source){var cancellationToken = source.Token;var queue = QueueHost.GetQueue<String>($"cmd:{node}");try{while (!cancellationToken.IsCancellationRequested){var msg = await queue.TakeOneAsync(10_000);if (msg != null){XTrace.WriteLine("WebSocket发送 {0} {1}", node, msg);socket.Send(msg.GetBytes(), WebSocketMessageType.Text);}else{await Task.Delay(1_000, cancellationToken);}}}catch (Exception ex){XTrace.WriteException(ex);}finally{source.Cancel();}}

再修改 ProcessRequest ,握手后异步启动大循环:

    /// <summary>处理请求</summary>/// <param name="context"></param>public virtual void ProcessRequest(IHttpContext context){var ws = context.WebSocket;ws.Handler = ProcessMessage;var source = new CancellationTokenSource();Task.Run(() => consumeMessage(ws, "nodeCode", source));WriteLog("WebSocket连接 {0}", context.Connection.Remote);}

借助Redis消息队列,每个设备一个Topic,对应一个WebSocket连接和消费大循环。

注:以上代码来自星尘 StarServer。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/299070.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SCCM 2007系列教程之三日志文件

Microsoft System Center Configuration Manager 2007 中的所有客户端和站点服务器组件都将过程信息记录在单个日志文件中。您可以使用客户端和站点服务器日志文件中的信息来帮助您诊断在 Configuration Manager 2007 层次结构中可能出现的问题。默认情况下&#xff0c;Configu…

Unix常用命令

第一章 目录及文件操作命令 1.1 ls [语法]&#xff1a; ls [-RadCxmlnogrtucpFbqisf1] [目录或文件......][说明]&#xff1a; ls 命令列出指定目录下的文件&#xff0c;缺省目录为当前目录 ./&#xff0c;缺省输出顺序为纵向按字符顺序排列。-R 递归地列出每个子目录的内容-…

继续送假期干货——响应式图片工具smartImg

中午看《众妙之门》看到一个响应式图片处理工具&#xff08;点此查看&#xff09;的介绍&#xff0c;然后就心血来潮想着不妨自己写一个基于JQ的吧&#xff0c;于是就又有了这么一个干货给大家。 smartImg 的全部文件可以从我的Github上下载&#xff0c;其实它非常小巧&#xf…

一顿家庭火锅让本不富裕的家庭雪上加霜......

1 从此再也没有人相信你曾是个双眼皮▼2 在家吃火锅让一个本不富裕的家庭雪上加霜▼3 大型翻车现场▼4 各位大爷大伯&#xff0c;我先干了招待不周&#xff0c;还望海涵▼5 老外为了防止用手摸脸导致传染发明出来的新方法 ......但这东西难道不是宠物那啥用的吗&#xff1…

JAVA中pin什么意思_java语言中的多态概述

多态&#xff1a;一个对象相应着不同类型多态在代码中的体现&#xff1a;父类或接口的引用指向其子类对象。多态的优点&#xff1a;提高了代码的扩展性&#xff0c;前期定义的代码能够使用后期的内容。多态的弊端&#xff1a;前期定义的内容不能使用后期子类中定义的特有内容。…

过滤非法字符

在最近的项目中自己写了一段处理过滤非法字符的函数 原理: &#xff11;:首先判断页面的提交方式只有在&#xff50;&#xff4f;&#xff53;&#xff54;的情况下才进行过滤非法字符 &#xff12;:将所以&#xff46;&#xff4f;&#xff52;&#xff4d;表单中的数据保存到…

ASP.NET Core 修改开源协议为MIT,.NET全平台 MIT协议开源了

2021年7月23日&#xff0c;.NET开发团队完成了所有的.NET平台的相关框架的MIT协议更改&#xff0c;我们可以通过 https://github.com/dotnet/aspnetcore/issues/18873 看到详细的修改提交&#xff0c;这个协议修改里面主要有2点&#xff0c;具体可以看 https://github.com/dotn…

耳机没有声音

一 硬件二 驱动三 服务四 设置设置问题 1.应该是电脑里面的声道&#xff0c;扬声器 里面有声道设置。点击喇叭 ——打开音量控制——扬声器音量&#xff0c;&#xff0c;里面左右啊 什么的搞搞就好了 2.禁止前面板插入

C++入门【14-C++ 指向数组的指针】

您可以先跳过本章&#xff0c;等了解了 C 指针的概念之后&#xff0c;再来学习本章的内容。 如果您对 C 指针的概念有所了解&#xff0c;那么就可以开始本章的学习。数组名是指向数组中第一个元素的常量指针。因此&#xff0c;在下面的声明中&#xff1a; double runoobAarray…

InstallSield更新包快速入门文档----感谢原作者ㄣ齊¨彡仯乄的无私提供

本文经原作者ㄣ齊彡仯乄特许授权于海洋女神发布&#xff0c;转载请务必注明出处与链接&#xff1b;原作者ㄣ齊彡仯乄和海洋女神保留对该文的一切法律许可下的权益&#xff1b;需要发布在盈利性报刊、网站等请与原作者ㄣ齊彡仯乄或海洋女神联系. 简述 本文主要描述安装程序更新包…

太赞了:中文版开源!这或许是最经典的计算机编程教材

全世界只有3.14 % 的人关注了爆炸吧知识转自 AI 科技大本营《Think Python》是很多计算机初学者的不二入门教材&#xff0c;受到广泛好评。该书原作者是美国 Olin 工程学院的教授 Allen B. Downey&#xff0c;目前该书的原版和中文版本都已免费开源。Allen 称&#xff0c;《Thi…

jBPM专家力作——《深入浅出jBPM》

恭喜本书荣登互动网和当当网畅销排行榜&#xff01;媒体评论 “这是一本全面介绍jBPM的书&#xff0c;从基础知识到实战开发技巧&#xff0c;作者结合其实际项目开发经验&#xff0c;对国内流程的许多特色要求给出了浅显易懂的解决方案。对于想在项目中应用jBPM的初学者&#x…

java gui 移动_JavaGUI如图:当鼠标按left按钮,右边的字会移动到左边按 爱问知识人...

import t。*;import javax。swing。*;import t。Rectangle;import t。event。ActionListener;import t。event。ActionEvent;/*** Title:** Description:** Copyright: Copyright (c) 2006** Company:** author zwh* version 1。0*/public class Frame1extends JFrame {public …

WeihanLi.Npoi 1.20.0 Released

WeihanLi.Npoi 1.20.0 ReleasedIntroWeihanLi.Npoi 是一个基于 netstandard2.0 的一个 NPOI 扩展库&#xff0c;主要用于导入导出 Excel 以及CSV&#xff0c;支持通过 Fluent API 的方式来支持非常灵活的导入导出配置&#xff0c;详细使用可以参考文档介绍以及项目示例Updates最…

转:Chrome渲染分析之Timeline工具的使用

概述 这个工具真的很强大&#xff0c;Timeline工具栏提供了对于在装载你的Web应用的过程中&#xff0c;时间花费情况的概览&#xff0c;这些应用包括处理DOM事件, 页面布局渲染或者向屏幕绘制元素。Timeline可以通过事件&#xff0c;框架&#xff0c;和实时内存用量3个方面的数…

工作流与Petri net的关系

SOA中国线路图 > SOA业务流程 > 工作流与Petri net的关系工作流与Petri net的关系 2008-7-10工作流与Petri net的关系 工作流的发展过程 以前&#xff0c;信息系统是设计来支持单个任务的执行。今天的信息系统需要支持业务流程&#xff0c;其不只局限于仅仅关心任务&…

数学和物理太难?这些动图让你秒懂抽象概念

数学动图△ 从椭圆的一个焦点射出的光线总会通过另一个焦点。△ 真人版。△ 一图看懂正弦、余弦和正切什么意思。△ 圆的面积。△ 如何理解圆的面积和派的关系。△ 勾股定理演示。直角三角形的两条直角边的平方和&#xff08;两个小正方形的面积&#xff09;&#xff0c;加起来…

java typereference_记录一下jackson中TypeReference的使用

今天在看到项目中有一段代码是将string字符串转化成对象&#xff0c;需要被转化成对象的类加了TypeReference&#xff0c;随即去百度了下。TypeReference是一个抽象类&#xff0c;继承了Comparable接口。里面的Type是一歌接口。贴上代码&#xff1a;mapper.readValue(station.g…

cisco综合实验

第四章综合实验<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />特效&#xff1a;[图]<?xml:namespace prefix v ns "urn:schemas-microsoft-com:vml" />第四章综合实验VTP的配置&#xff1a;S<?xml:name…

Docker小白到实战之容器数据卷,整理的明明白白

前言上一篇把常用命令演示了一遍&#xff0c;其中也提到容器的隔离性&#xff0c;默认情况下&#xff0c;容器内应用产生的数据都是由容器本身独有&#xff0c;如果容器被删除&#xff0c;对应的数据文件就会跟着消失。从隔离性的角度来看&#xff0c;数据就应该和容器共存亡&a…