ASP.NET中WebSocket 的使用总结

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" οnclick="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();
           }
       }

    }
}

                    





     




  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值