ASP.NET中WebSocket 的使用总结

.NET 即时通信,WebSocket服务端实例 即时通信常用手段 1.第三方平台 谷歌、腾讯 环信等多如牛毛,其中谷歌即时通信是免费的,但免费就是免费的并不好用。其他的一些第三方一般收费的,使用要则限流(1s/限制x条消息)要么则限制用户数。 但稳定性什么都还不错,又能将服务压力甩出 2.System.Net.Sockets.Socket,也能写一套较好的服务器端。在.NET 4.5之前用较多,使用起来麻烦。需要对数据包进行解析等操作(但 阅读详情

1.需求背景:

1.1公司现有热敏面单打印机,目前的操作方式是通过cs客户端程序驱动打印,使用的是fastreport打印控件.需要在不做打印模版变动的情况下将打印功能迁移到web端


1.2思路分析

      经过初步分析,发现此打印无预览,通过后台程序可直接对打印机进行操作.客户的操作是在web上,实现的打印可在打印终端机上,而实现

打印的终端机一般是在客户现场或者是在一台独立的电脑上,并且与内网相连接.有点像客户端服务器的模式架构.并且请求要求的实时性非常高.

      客户端(javascript发送打印请求)---->web端接收---->推送数据到客户端打印机上--->将打印成功打印失败信息随时反馈给客户.

      初步设想使用websocket,因为websocket是基于http协议的.并且是html5的一种新协议.全双工模式.并且能更好的节省服务器资源和宽带达到实时通信,目前大部分

的web浏览器都实现了websocket


1.2程序简介

     程序分为客户端和服务器端

     客户端需使用javascript语言进行调用:

    

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>

    <script language="javascript" type="text/javascript">
        //var _post_params = 'notify_type=03&ware_house=HW001&e_commerce_code=&logic_company_code=&operate_date=&operate_date_to=&way_bill_no=&way_bill_no_dou=&isPrint=false&page_Index=1&page_size=10&is_get_rowcount=false&total_count=0';
        var _post_params = '{ "notify_type": "03", "ware_house": "HW001", "e_commerce_code": "", "logic_company_code": "", "operate_date": "", "operate_date_to": "", "way_bill_no": "","way_bill_no_dou":"","isPrint":"false","page_Index":1,"page_size":10,"is_get_rowcount":"false","total_count":0,"orderNos":"" }';

        var websocket;
        
        function printWebSocket() {
    try {
            var dooperate = getParameter("dooperate");
            if (dooperate == "print")
            {

                _post_params = getParameter("print_params");
                //alert("_post_params:" + _post_params);
                if (_post_params == "" || _post_params == null || typeof (_post_params) == "undefined") {

                }
                else {
                    //alert(_post_params);
                    //websocket = new WebSocket("ws://10.35.2.55:2014/");
                    websocket = new WebSocket("ws://127.0.0.1:2014/");
                    websocket.onopen = function(evt) { onOpen(evt) };
                    websocket.onclose = function(evt) { onClose(evt) };
                    websocket.onmessage = function(evt) { onMessage(evt) };
                    websocket.onerror = function(evt) { onError(evt) };
                }
            }

        } catch (e) {
            alert("出错了");
        }
          
        }

        function onOpen(evt) {
            doSend(_post_params);
        }

        function onClose(evt) 
        {
           //alert(evt.data);
        }

        function onMessage(evt) {
            if (typeof (evt.data) != "undefined") 
            {
                alert(evt.data);
            }   
           
        }

        function onError(evt) {
            //alert(evt.data);
            alert("未检测到打印服务,请确认!");
        }

        function doSend(message)
         {
           websocket.send(message);
       }

       function getParameter(param) {
           try {
               var query = decodeURIComponent(window.location.search);
              // alert(query);
               //var query = window.location.search;
               var iLen = param.length;
               var iStart = query.indexOf(param);
               if (iStart == -1)
                   return "";
               iStart += iLen + 1;
               var iEnd = query.indexOf("@", iStart);
               if (iEnd == -1)
                   return query.substring(iStart);
               return query.substring(iStart, iEnd);
           }
           catch (e) {
               alert("出错了");
           }

       }

       try {
           window.addEventListener("load", printWebSocket, false);
       } catch (e) { }

 
    </script>

</head>
<body>
      <input type="button" onclick="printWebSocket()" value="执行EXE" />
</body>
</html>

   


     服务器端:使用SuperWebSocket.dll进行构建,请引用好以下dll  点击下载

     服务器端主要代码如下:

    

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using SuperWebSocket;
using Newtonsoft.Json;

namespace WebSocketServerDcits
{
   public class Program
    {
        private const string ip = "127.0.0.1";
        private  const int port = 2014;
        private static WebSocketServer ws = null;

       public static void Main(string[] args)
        {
            ws = new WebSocketServer();//实例化WebSocketServer
            ws.NewSessionConnected += ws_NewSessionConnected;//有新会话握手并连接成功
            ws.SessionClosed += ws_SessionClosed;//有会话被关闭 可能是服务端关闭 也可能是客户端关闭
            ws.NewMessageReceived += ws_NewMessageReceived;//有客户端发送新的消息
            Start();
            Console.ReadLine();
        }

      static void ws_NewSessionConnected(WebSocketSession session)
       {
           Console.WriteLine("{0:HH:MM:ss}  与客户端:{1}创建新会话", DateTime.Now, session.RemoteEndPoint.Address);
       }

      static void ws_SessionClosed(WebSocketSession session, SuperSocket.SocketBase.CloseReason value)
       {
           Console.WriteLine("{0:HH:MM:ss}  与客户端:{1}的会话被关闭 原因:{2}", DateTime.Now, session.RemoteEndPoint.Address, value);
       }

      static void ws_NewMessageReceived(WebSocketSession session, string value)
       {
           var msg = string.Format("{0:HH:MM:ss} {1}: {2}", DateTime.Now, session.RemoteEndPoint.Address, value);
           Console.WriteLine(msg);
           //返回给客户端  客户端接收xx.data就可以了
           string message = "";
           try
           {
               if (string.IsNullOrEmpty(value))
               {
                   session.Send("未接收到参数!");
                   return;
               }

               string[] printParams = value.Split('&');
               HWCOrderParamsEntity printParamsJson = new HWCOrderParamsEntity ();
               printParamsJson.notify_type = printParams[0].Split('=')[1];
               printParamsJson.ware_house = printParams[1].Split('=')[1];
               printParamsJson.orderNos = printParams[13].Split('=')[1];
               printParamsJson.is_get_rowcount = printParams[11].Split('=')[1];
               printParamsJson.page_size =Convert.ToInt32( printParams[10].Split('=')[1]);
               printParamsJson.page_Index = Convert.ToInt32(printParams[9].Split('=')[1]);
               printParamsJson.user_name = printParams[14].Split('=')[1];//登录人
               printParamsJson.isPrint = printParams[8].Split('=')[1];//是否已打印
               int intCount = 0;

               switch (printParamsJson.notify_type)
               {
                   case "03": 
                       //todo
                       break;
                   case "02": 
                       //todo
                       break;
                   case "01": 
                       break;
                   default:
                       message = "未知的面单打印类型";
                       break;
               }
               
           }
           catch (Exception ex)
           {
               message = ex.Message;
           }
           if (!string.IsNullOrEmpty(message))
           {
               session.Send(message);
           }
       }

       /// <summary>
       /// 启动服务
       /// </summary>
       /// <returns></returns>
     public static void Start()
       {
           if (!ws.Setup(ip, port))
           {
               Console.WriteLine("WebSocketServer 设置WebSocket服务侦听地址失败");
               return;
           }
           if (!ws.Start())
           {
               Console.WriteLine("WebSocketServer 启动WebSocket服务侦听失败");
               return;
           }
           Console.WriteLine("WebSocketServer 启动服务成功");
       }

       /// <summary>
       /// 停止侦听服务
       /// </summary>
     public static void Stop()
       {

           if (ws != null)
           {
               ws.Stop();
           }
       }

    }
}

                    





     




WebSocket在Asp.Net中的例子,新手流程 运行环境 win10+IIS10.0 Express 详细步骤 新建一个ASP.NET web项目,选择空白模板 添加新项,Web窗体:Index.aspx 一般处理程序:WebSocketHandler.ashx,新建完成后运行。 写入代码 Index.aspx <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Ind... 阅读详情

相关推荐

ASP.NET Core基于WebSocket实现消息推送实战演练

一、课程介绍 很多网站为了实现推送技术,所用的技术都是 Ajax 轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。 HTML5 定义的 WebSocket 协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。 今天我们要通过使用ASP.Net

跟着阿笨一起玩NET 3244

理解ASP.NET Core 中的WebSocket

在本文中,我们将详细介绍RFC 6455 WebSocket规范,并配置一个通用的.NET 5应用程序通过WebSocket连接与SignalR通信。 我们将深入底层的概念,以理解底层发生了什么。 关于WebSocket 引入WebSocket是为了实现客户端和服务器之间的双向通信。HTTP 1.0的一个痛点是每次向服务器发送请求时创建和关闭连接。但是,在HTTP 1.1中,通过使用保持连接机制引入了持久连接(RFC 2616)。这样,连接可以被多个请求重用——这将减少延迟,因为服务器知道客户端,它们不需要

极客神殿 5393

使用ASP.NET MVC实现WebSocket通信

在页面加载完成后,我们创建了一个名为"chat"的连接,并定义了"broadcastMessage"方法来处理接收到的消息。在上面的示例中,我们创建了一个名为"ChatHub"的类,并继承了SignalR的"Hub"类。在Visual Studio中,选择"新建项目",然后选择"ASP.NET Web应用程序"模板。在模板选择中,选择"空"模板,并勾选"添加核心参考"和"使用身份验证"选项。点击"确定"创建项目。在上面的配置中,我们将"/chatHub"路径映射到了我们之前创建的"ChatHub"类。

library_git106的博客 590

ASP.NET Web API上实现 Web Socket

1. 什么是Web Socket Web Socket是Html5中引入的通信机制,它为浏览器与后台服务器之间提供了基于TCP的全双工的通信通道。用以替代以往的LongPooling等comet style的实时解决方案。基于它们之间的比较以及Web Socket的优势参考https://www.websocket.org/quantum.html. 2. Web Socket如何工作 Conne...

chenxi004的博客 1868

Asp.Net实现Websocket.rar

使用Asp.Net技术完成WebSocket开发。 使用HttpHandler,进行请求的过滤,处理websocket请求。

ASP.NET实例开发源码——网页打印控件Lodop4.0专业精致.zip

ASP.NET实例开发源码——网页打印控件Lodop4.0专业精致

如何 ASP.NET Core 中使用 WebSocket

摘要:本文详细介绍了在ASP.NET Core中实现WebSocket通讯的完整流程。文章首先阐述了WebSocket在实时应用中的优势,如聊天室、金融交易等场景。然后分三个阶段演示实现过程:1)服务器端配置WebSocket中间件和路由;2)客户端创建WebSocket连接;3)测试多个客户端连接。最后通过构建聊天室应用演示了多用户消息广播功能,包括用户加入/离开通知等特性。教程提供了完整的代码示例,帮助开发者快速掌握ASP.NET Core中WebSocket的实现方法。

csdn_aspnet的专栏,请点击博客主页右上角三个点中的私信联系 1665

NET 实战:30 天搞定企业级 Web 订餐系统(附完整源码 + 数据库设计)

订餐流程:浏览菜品 → 选择菜品及数量 → 填写送餐地址 → 提交订单 → 数据库记录核心代码(绑定菜品列表):vb' 绑定菜单表到DataGrid控件,展示菜品信息user id=sa;' 查询菜品名称、价格、口味Dim adpt1 As New SqlDataAdapter("select cdishid,vdishname 菜品名称,cdishrate 价格,vdishdescription 口味 from dish", conn)End Sub用户体验优化。

m0_67740236的博客 1517

ASP.NET MVC 实现WebSocket

目录 WebSocket原理 支持的客户端 ASP.NET实现 服务端 客户端 踩到的坑 有时我们需要由浏览器实时接收消息或者数据,这样的需求使用传统的Ajax轮询浪费资源不说效率还十分低下。而WebSocket技术可以帮助我们轻松解决这些问题。 WebSocket原理 由客户端发起,向服务器发送websocket握手信号,受支持的服务端随即向客户端回应并保持此连接不会自动断...

天空之城的博客 6433

Matlab中eig内置函数转为C语言

本文记录一下如何将MATLAB中的eig函数转为C语言,即通过C语言求解矩阵的特征值与特征向量。[V,D]=eig(Rx)中V为矩阵Rx的特征向量,D为矩阵的特征值。其中Rx维度为12*12的复矩阵。 首先在MATLAB端创建入口函数保存为eigvalue.m: 打开MATLAB Coder,添加入口函数: 3.在定义输入类型窗口中,需要添加输入数据来训练...

u011441044的博客 3516

详解一典型的反激式开关电源方案

如图,在某系统方案上看到下图所示的单端反激式开关电源方案。

alala120的博客 1万+

ASP.NET |日常开发中Websocket详解

ASP.NET |日常开发中Websocket详解,在ASP.NET的日常开发中,WebSocket 是一种提供全双工通信通道的协议,它允许服务器和客户端之间进行实时的双向数据传输。这种通信方式对于需要实时更新的应用程序非常有用,比如聊天应用、实时通知系统、在线游戏等。接下来,我们将详细介绍ASP.NET中WebSocket的使用。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 2305

SAP CO-PA获利分析避坑指南:从数据采集到报表设计的5个关键步骤

本文深入解析了SAP CO-PA获利分析模块从数据采集到报表设计的完整流程。文章重点剖析了数据源头、特征派生、获利段设计等关键步骤,并对比了基于账户与基于成本核算两种模式的差异,特别强调了在S/4HANA时代的选择与常见陷阱,旨在帮助企业构建可靠、可执行的盈利分析体系。

flink9streamer的博客 827

Asp.Net Core WebSocket绑定

转:https://blog.csdn.net/u011127019/article/details/77408072 1.说明 Asp.Net Core中WebScoket的操作使用基本上和Asp.net中相同,不同的是,绑定监听。 Asp.Net Core2.0默认已经支持WebSocket,不需要另外安装Nuget包。  通过对HttpContext中的WebSockets.Acce...

xsfqh的专栏 1313

精确时钟同步协议ptp/IEEE-1588v2协议-------(1)简介

ptp, 1588V2, IEEE-1588, 精确时钟同步协议

meihualing的专栏 5360

SerDes电路的PCB仿真设计规则及策略

SerDes的PCB设计中,重点工作是使用3D 电磁 (EM) 场求解器,进行过孔结构优化,包括 BGA的扇入和扇出区域以及布线的过孔区域,并且,利用连接器供应商提供加密的 3D 模型,进行连接器和 PCB 的级联仿真,最终获取系统级的通道性能参数,如插入损耗、回波损耗、串扰和模式转换、阻抗曲线等,如果发现任何缺陷,再进行进一步优化,这一过程中,推荐进行拆分仿真,以提高设计效率。

一只豌豆象的博客 2193

最新 .NET Core 中 SignalR的使用 以及 WebSocket的使用 同时在Asp.Net MVC 中 WebSocket的使用

ASP.NET MVC 中使用WebSocket 笔记 1.采用控制器的方法 这个只写建立链接的方法的核心方法 1.1 踩坑 网上都是直接 传个异步方法 直接接受链接 自己尝试了好多次链接是打开的,到时获取不到链接里面的内容!! (如果是我理解有问题的话,欢迎讨论,毕竟这个问题卡了我好久!) 1.2 自己建立链接的使用截图方法 1 /// <summary> 2 /// WebSocket链接 demo地址 ws://Localhost:80...

weixin_39842602的博客 3416

汽车行业OTD业务模式入门学习

本文是在学习彭俊松老师的《汽车行业整车订单交付系统》后,对于OTD理解的一些摘录,供诸位参考学习。

qq_40664711的博客 1万+

Asp.Net Core6 WebSocket绑定

一、Asp.Net Core6 WebSocket绑定 使用中间件绑定WebSocket app.UseWebSockets(); app.Map("/upload/common", (con) => { con.UseWebSockets();//启用webscoket con.Use(async (ctx, next) => { Receiver _receive = new Receiver(ctx

天马3798 3889

HandwrittenMathFormulaRecognition:基于YOLOv8的手写数学公式识别系统

输入:包含手写数学公式的图像(拍摄的板书、作业纸等)输出:对应的数字文本形式的数学公式(如LaTeX格式或文本表达式)标准的手写数学表达式数据集,包含在线轨迹及图片,广泛用于公式识别研究。包含近10万对公式图片及对应的LaTeX标注,适合训练公式识别模型。MathBrush公开手写数学公式图像数据集,含多种书写风格。手写数字与符号数据集(MNIST及其扩展)用于基础数学符号的训练。

YOLO 283

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

ASP.NET Core WebSocket、SignalR

ASP.NET Core SignalR(以下简称SignalR),是.NET Core平台下对WebSocket的封装。 Hub(集线器),数据交换中心。WebSocket基于TCP协议,支持二进制通信,双工通信。 性能和并发能力更强。 WebSocket独立于HTTP协议,不过我们一般仍然把WebSocket服务器端部署到Web服务器上,因为可以借助HTTP协议完成初始的握手(可选),并且共享HTTP服务器的端口(主要)。

Anoxia_li的博客 1360

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

WebSocket in ASP.NET Core

一、WebSocket   WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算) 首先HTTP有1.1和1.0之说,也就是所谓的keep-alive,把多个HTTP请求合并为一个,但是Websocket其实是一个新协议,跟HTTP协议基本没有关系,只是为了兼容现有浏览器的握手规范而

dotNET跨平台 522

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Asp.Net Core6 WebSocket 简单案例

一、Asp.Net Core6 后端,开启并绑定服务器端WebSocket1. 启动文件启动绑定 2.封装监听响应 二、客户端连接并监听相应内容1.html 2.js 查看预览结果: 更多:

天马3798 4405

ASP.NET Core通过Websocket建立简单聊天室

初学者的傻瓜式笔记,备忘

m0_64916060的博客 2098

asp.net WEBSocket简单例子 推送数据

asp.net WEBSocket简单例子 推送数据 原创湫化风雨 发布于2018-12-05 10:41:53 阅读数 3214 收藏 展开 asp.net WEBSocket简单例子 推送数据 public class SocketHandler { public const int BufferSize = 4096; //缓冲区 /// &l...

cxu123321的博客 841

Websocket在Asp.net webApi(.net framework)上的应用

之前在写看板部分的web api的时候,都是通过Ajax在规定时间内轮询调用web api,这样简单省事,但是当看板多了(并发量上来)以后,比较消耗服务器的性能,所以最近研究了websocket,希望使用websocket只在数据发生变化时向客户端推送数据。所有支持 HTTP/2 的平台上的 Kestrel 中都提供了这些受支持的功能。版本协商在浏览器和 Kestrel 中是自动的,因此不需要新的 API。方案2:WebScoket协议,ws, http2,客户端支持良好。

cxzhq2002的杂记 1215
上一篇: C#开发小经验分享之一文件操作
下一篇: 多文件上传uploadify.v2.1.0使用总结
sinbadxia
博客等级 码龄18年 3粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值