第45篇 js操作打开本地程序

原文地址:http://blog.laofu.online/2017/06/10/how-js-controlApp/

背景

假设有这样一个产品,一个web和一个winform客户端,在客户在web的网页上面点击启动客户端来处理,这个时候开始调用本地的客户端,来完成指定的工作。这种场景在日常的上网中也比较常见,如使用迅雷下载。当然实现的方式也有很多种,今天我来演示一种用监控Http请求来实现这个功能,思路如下:

HttpListener

对于上面的分析,最重要的功能虽实现对Http的监控,而.net中已经封装了我们的需求,下面看下如何具体的实现:

static void Main(string[] args)
{
        HttpListener listerner = new HttpListener();

        try
        {
            listerner.AuthenticationSchemes = AuthenticationSchemes.Anonymous;//指定身份验证 Anonymous匿名访问
            listerner.Prefixes.Add("http://localhost:8080/Service/");
            listerner.Start();
        }
        catch (Exception ex)
        {
            Console.WriteLine("无法启动监视:" + ex.Message);
        }

        Task.Factory.StartNew(() =>  //使用一个线程对监听
        {
            while (true)
            {
                HttpListenerContext ctx = listerner.GetContext();
                Task.Factory.StartNew(TaskProc, ctx);//回调函数,开启新线程进行调用,不影响下次监听
            }
        });

        Console.ReadKey();
    }

实现请求的响应

现在我们可以拿到请求的上下文的信息ctx,先定义一个参数的格式,简单的定义如下:

   public class ReciveInfo
    {
        public string path { get; set; }//应用程序所在的路径

        public string name { get; set; }//应用程序名称
    }

下面对ctx的Response数据进行填写.

  static void TaskProc(object o)
    {
        HttpListenerContext ctx = (HttpListenerContext)o;
        StreamWriter writer = new StreamWriter(ctx.Response.OutputStream, Encoding.UTF8);
        try
        {
            //接收POST参数
            Stream stream = ctx.Request.InputStream;
            StreamReader reader = new StreamReader(stream, Encoding.UTF8);
            String body = HttpUtility.UrlDecode(reader.ReadToEnd());
            Console.WriteLine(body);
            var reciveInfo = Json.JsonParser.Deserialize<ReciveInfo>(body);
            Process.Start(reciveInfo.path);
             ctx.Response.Headers.Add("Access-Control-Allow-Origin","*"); //防止出现跨域的问题错误
            ctx.Response.StatusCode = 200; //设置返回给客服端http状态代码
            writer.Write(reciveInfo.name + "启动成功");
        }

        catch (ArgumentException e)
        {
            ctx.Response.StatusCode = 500;
            writer.Write("参数有误:" + e.Message);
        }
        catch (Exception e)
        {
            ctx.Response.StatusCode = 500;
            writer.Write("程序异常:" + e.Message);
        }
        finally
        {
            writer.Close();
            ctx.Response.Close();
        }

    }

测试

在测试中我在js中启动我电脑中的QQ,具体的代码如下:

<button id="btnQQ"> start QQ</button>
    <script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
    <script type="text/javascript">
    $(function() {
        $("#btnQQ").click(function() {

            $.ajax({
                type: "POST",
                url: "http://localhost:8080/Service",
                dataType: "json",
                data: JSON.stringify({
                    path: "D:/Program Files/Tencent/QQ/Bin/QQScLauncher.exe",
                    name: "qq"
                })
            });
        });
    });
    </script>

启动后,运行截图如下:

时间: 2024-08-28 08:51:33

第45篇 js操作打开本地程序的相关文章

通过私有协议在Chrome浏览器网页中打开本地程序

最近甲方有这样一个需求:两套系统,一套基于Chrome开发,一套基于IE开发,想要在Chrome中增加一个链接,然后进入IE开发的系统.也就是说,想要在Chrome中创建链接跳转到IE浏览器指定页面,还要实现跳转动画效果.这个需求我们先来解决从Chrome跳转到IE的问题. 问题分析:从Chrome中跳转到IE,直接以http链接形式是不可能跳转到IE的,只能通过单独开发的本地程序打开IE,问题是如何让Chrome打开该程序.有一种方法可以实现:通过注册私有协议,用户点击链接的时候直接使用私有协

C#注册URL协议,使用浏览器打开本地程序,类似网页上点了QQ交谈打开本地QQ客户端程序

本教程适用于Windows系统 从浏览器上打开本地程序,主要用到了本地URL协议,其实主要就是改注册表 先建立一个项目,我建的是控制台项目 在Program.cs写2个静态方法用来添加注册表.移除注册表(用浏览器打开程序主要就是靠这两个方法) /// <summary> /// 注册启动项到注册表 /// </summary> public static void Reg() { //注册的协议头,即在地址栏中的路径 如QQ的:tencent://xxxxx/xxx 我注册的是ju

在网页打开本地程序的思路

一.直接打开. 这种方法一百度就可以看到好几种. 比如: 1.通过注册表.原理,在微软的MSDN上也有说明:http://msdn.microsoft.com/en-us/library/aa767914%28v=vs.85%29.aspx 可以通过本地程序写入注册表完成,然后直接在页面上写上相应的url 2.第二种就是直接写js.不过现在的浏览器因为安全的原因都不怎么支持 这两种方法都不怎么通用. 二.通过服务器通知本地程序启动 思路也简单,就是网页向服务器发起打开程序的请求,然后服务器通过本

通过私有协议Chrome浏览器页面打开本地程序

近期方有这样的要求:这两个系统,根据一组Chrome开展,根据一组IE开展,需要Chrome添加一个链接,然后进入IE该系统的开发.这,需要Chrome跳转到创建一个链接IE浏览器指定的页面.同时也实现了跳跃的动画.第一解决的需要我们的Chrome转到IE的问题. 问题分析:从Chrome中跳转到IE,直接以http链接形式是不可能跳转到IE的,仅仅能通过单独开发的本地程序打开IE,问题是怎样让Chrome打开该程序.有一种方法能够实现:通过注冊私有协议,用户点击链接的时候直接使用私有协议调用本

第十三篇 JS 操作table表格

JS 操作table表格 这节课难度可能高一点,因为没有提前解释if判断.for循环.这节课是直接把这两样用上了,老师先简单介绍一下: if,判断语句,判断就很简单了嘛,假如说1=1(1等于1),当然是真的了对吧,那么1=2呢,那就是假的,因为正常情况下,1不可能等于2,1就是1.那么我们在JS里写一个: var a=1; if(a=1){ alert('正确'); }else{ alert('错的'); } 给一个变量,来做判断,大家记住,if也有它的规则,先一个if,圆括号做判断,随后一个花

js实现打开本地文件或文件夹

原网址:http://blog.csdn.net/cofesun/article/details/7904887javascript有个特殊的对象ActiveXObject,通过它可以访问windows的本地文件系统和应用程序 <script> function openFileIIs(filename){ try{ var obj=new ActiveXObject("wscript.shell"); if(obj){ obj.Run("\""

node.js操作数据库之MongoDB+mongoose篇

前言 node.js的出现,使得用前端语法(javascript)开发后台服务成为可能,越来越多的前端因此因此接触后端,甚至转向全栈发展.后端开发少不了数据库的操作.MongoDB是一个基于分布式文件存储的开源数据库系统.本文为大家详细介绍了如何用node.js + mongoose 玩转MongoDB.希望能帮到有需要的人. 由于我用Mac开发,以下所有操作都是在Mac下进行. 一. 环境搭建 安装Node.js 有 node 环境的可以跳过. nodejs官网提供了 macOS 安装包,直接

Js调用本地程序

<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>无标题文档</title> <script language=javascript> function Open() { var wsh=new ActiveXObject("wscript.shell&

注册自定义协议,通过浏览器链接打开本地应用程序

参考:http://www.cnblogs.com/leslies2/p/3727762.html using System; using System.Security.AccessControl; using System.Windows; using Microsoft.Win32; namespace QPP.AutoUpdater { public static class Registry { /*将协议写入注册表,以便可以通过协议打开程序*/ /*参考http://www.cnbl