基于asp.netCoreWebApi的webSocket通信示例(net6)
背景:
在阿里云服务器中搭建了常规的tcp server服务(基于.net framework 4.0)。用以实现远程控制家里的鱼缸灯,办公室的电脑开关机等功能。客户端采用PC桌面端和微信小程序端。
服务端:tcp server(基于.net framework 4.0)
客户端:PC桌面端软件(.net winform)、微信小程序
问题:
微信小程序端支持websocket通信而且必须是wss(wss表示在TLS之上的websocket,相当于https),无法与tcp server直接通信。
为什么不重新开发服务端呢?
一是我懒。
二是服务端TCP Server必须时刻保持与家里的鱼缸灯控制器,办公室的开关机控制器等设备的网络连接。而且还设定了定时执行的策略,故不适宜更换其他技术实现。
解决方法:
微信小程序的后端采用了asp.net web api (net6)搭建的接口服务。如果可以在该web api 接口服务中搭建websocket服务,中转微信小程序和tcp server服务端,同时升级TCP Server,使之同时支持tcp client连接和websocket连接,问题可得到解决。
开干!
一、新建ASP.NET Core Web API 项目(net6)
基于net 6.0
二、创建websocket中间件WebsocketHandler
新建类,名为:WebsocketHandler
在接收到websocket连接时,将触发Invoke函数。
关键代码:
WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();_logger.LogInformation($"接收到websocket连接.");try{WebSocketReceiveResult result;do{var buffer = new byte[1024 * 1];result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);if (result.MessageType == WebSocketMessageType.Text && !result.CloseStatus.HasValue){var msgString = Encoding.UTF8.GetString(buffer);_logger.LogInformation($"接收到数据:{msgString}.");//发送接收到的信息await webSocket.SendAsync(new ArraySegment<byte>(buffer, 0, buffer.Length), WebSocketMessageType.Text, true, CancellationToken.None);}}while (!result.CloseStatus.HasValue);}catch (Exception ex){}
AcceptWebSocketAsync函数接收websocket连接,并把连接保存于变量webSocket。
定义变量WebSocketReceiveResult result用来接收客户端发送的数据,webSocket.ReceiveAsync函数接收数据。
webSocket.SendAsync函数实现向客户端发送数据的功能。
可以看到,为了测试发送和接收的功能,服务端将接收到的数据直接返回给客户端
三、添加中间件
在Program中添加此中间件:
app.UseWebSockets();
app.UseMiddleware<WebsocketHandler>();
至此,服务端已建好。
四、运行服务端
Ctrl+F5,运行服务端,可看到,监听端口为:5276
五、创建客户端:测试.html
创建静态页面:webSocketClient.html,作为客户端,该客户端将实现向服务端发送消息,并接收服务端的消息。
使用原生javascript实现,不依赖其他js库。
关键函数:
创建websocket:new WebSocket(server + '/ws');
websocket打开成功事件:WEB_SOCKET.onopen
websocket接收消息事件:WEB_SOCKET.onmessage
websocket关闭事件:WEB_SOCKET.onclose
<button type="button" onclick="javascript:connectWebSocket()">测试</button>
界面上放置一个按钮,触发websocket。
六、测试成功
双击在浏览器中打开webSocketClient.html,同时按F12打开调试器。点击“测试”按钮,观察控制台面板,可看到websocket接收到来自服务器的消息“hello world”
而服务端面板:显示接收到websocket连接并接收到消息“hello world"
我已将代码上传,下载码是:C67F979907
下载码是啥?如何下载=》点击查看
基于asp.netCoreWebApi的webSocket通信示例(net6)相关推荐
- 基于WS协议的webSocket通信
使用的是java-webSocket github地址:https://github.com/TooTallNate/Java-WebSocket 客户端 private final Executor ...
- 基于asp.net2 C#开发MapServer
MapServer是个开源GIS,这里不用介绍了. 网上有基于asp.net1.1 C#开发示例(Thinking in GIS http://www.paolocorti.net) 下载的例子有个 ...
- JavaScript组件之JQuery(A~Z)教程(基于Asp.net运行环境)[示例代码下载](一)
(一).概述 现在有好多比较优秀的客户端脚本语言组件, 如: Prototype.YUI.jQuery.mootools.Bindows, Scriptaculous, FCKEditor 等, 都非 ...
- python socket模块实现udp通信_Python基于socket模块实现UDP通信功能示例
Python基于socket模块实现UDP通信功能示例 本文实例讲述了Python基于socket模块实现UDP通信功能.分享给大家供大家参考,具体如下: 一 代码 1.接收端 import sock ...
- 基于H5的webSocket通信
基于H5的webSocket通信 这里主要以一个简单例子来做说明 创建一个主服务器 1.创建一个主服务器 主服务器创建逻辑过程 /*1.通过ws模块来创建服务器2.服务器连接客户端---(给客户端编号 ...
- javascript python 通信_Python通过websocket与js客户端通信示例分析
具体的 websocket 介绍可见 http://zh.wikipedia.org/wiki/WebSocket 这里,介绍如何使用 Python 与前端 js 进行通信. websocket 使用 ...
- 基于 Asp.Net的 Comet 技术解析
Comet技术原理 来自维基百科:Comet是一种用于web的技术,能使服务器能实时地将更新的信息传送到客户端,而无须客户端发出请求,目前有两种实现方式,长轮询和iframe流. 简单的说是一种基于现 ...
- Python3+WebSockets实现WebSocket通信
一.说明 1.1 背景说明 前端时间同事说云平台通信使用了一个websocket的东西,今天抽空来看一下具体是怎么个通信过程. 从形式上看,websocket是一个应用层协议,socket是数据链路层 ...
- 基于ASP.NET Core SignalR的流式传输
基于ASP.NET Core SignalR的流式传输 SignalR概述 SignalR是ASP.NET Core下非常流行的实现Web实时功能的库.微软再文档中列出了适合的应用场景: 适合 Sig ...
最新文章
- python使用socket实现协议TCP长连接框架
- 如何优雅的关闭容器,看这一篇就够了
- 鱼油账号记录程序 - 零基础入门学习Delphi38
- 项目质量管理:质量与质量管理概念
- 云炬随笔20161012
- Match Points
- 【渝粤教育】 国家开放大学2020年春季 1325妇产科学与儿科护理学 参考试题
- pdf.js浏览中文pdf乱码的问题解决
- c语言char有什么作用,C语言中char*和char[]用法区别分析
- dg修改归档目录 oracle_DG环境下ORACLE自动回收归档空间
- 在Windows 下如何使用 AspNetCore Api 和 consul
- Dubbo 2.7.7 发布,FastJson 升级了!
- 电脑硬盘右击计算机就卡死,Win10电脑使用过程中莫名其妙卡死的的三种解决方法...
- 【RGB检测】基于matlab GUI图像RGB检测【含Matlab源码 088期】
- java简易计算器程序框图_简易计算器程序设计思路及流程图
- 网页采集器,全自动网站采集发布(图文)
- dell计算机的硬盘如何分区,戴尔电脑分盘怎么分区
- 联想笔记本电脑安装Ubuntu18.04系统
- 读文献——《Deep Residual Learning for Image Recognition》
- 范围变更管控案例_项目范围管理案例之范围确认案例