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

背景

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

HttpListener

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

  1. static void Main(string[] args)
  2. {
  3. HttpListener listerner = new HttpListener();
  4.  
  5. try
  6. {
  7. listerner.AuthenticationSchemes = AuthenticationSchemes.Anonymous;//指定身份验证 Anonymous匿名访问
  8. listerner.Prefixes.Add("http://localhost:8080/Service/");
  9. listerner.Start();
  10. }
  11. catch (Exception ex)
  12. {
  13. Console.WriteLine("无法启动监视:" + ex.Message);
  14. }
  15.  
  16. Task.Factory.StartNew(() => //使用一个线程对监听
  17. {
  18. while (true)
  19. {
  20. HttpListenerContext ctx = listerner.GetContext();
  21. Task.Factory.StartNew(TaskProc, ctx);//回调函数,开启新线程进行调用,不影响下次监听
  22. }
  23. });
  24.  
  25. Console.ReadKey();
  26. }

实现请求的响应

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

  1. public class ReciveInfo
  2. {
  3. public string path { get; set; }//应用程序所在的路径
  4.  
  5. public string name { get; set; }//应用程序名称
  6. }

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

  1. static void TaskProc(object o)
  2. {
  3. HttpListenerContext ctx = (HttpListenerContext)o;
  4. StreamWriter writer = new StreamWriter(ctx.Response.OutputStream, Encoding.UTF8);
  5. try
  6. {
  7. //接收POST参数
  8. Stream stream = ctx.Request.InputStream;
  9. StreamReader reader = new StreamReader(stream, Encoding.UTF8);
  10. String body = HttpUtility.UrlDecode(reader.ReadToEnd());
  11. Console.WriteLine(body);
  12. var reciveInfo = Json.JsonParser.Deserialize<ReciveInfo>(body);
  13. Process.Start(reciveInfo.path);
  14. ctx.Response.Headers.Add("Access-Control-Allow-Origin","*"); //防止出现跨域的问题错误
  15. ctx.Response.StatusCode = ; //设置返回给客服端http状态代码
  16. writer.Write(reciveInfo.name + "启动成功");
  17. }
  18.  
  19. catch (ArgumentException e)
  20. {
  21. ctx.Response.StatusCode = ;
  22. writer.Write("参数有误:" + e.Message);
  23. }
  24. catch (Exception e)
  25. {
  26. ctx.Response.StatusCode = ;
  27. writer.Write("程序异常:" + e.Message);
  28. }
  29. finally
  30. {
  31. writer.Close();
  32. ctx.Response.Close();
  33. }
  34.  
  35. }

测试

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

  1. <button id="btnQQ"> start QQ</button>
  2. <script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
  3. <script type="text/javascript">
  4. $(function() {
  5. $("#btnQQ").click(function() {
  6.  
  7. $.ajax({
  8. type: "POST",
  9. url: "http://localhost:8080/Service",
  10. dataType: "json",
  11. data: JSON.stringify({
  12. path: "D:/Program Files/Tencent/QQ/Bin/QQScLauncher.exe",
  13. name: "qq"
  14. })
  15. });
  16. });
  17. });
  18. </script>

启动后,运行截图如下:

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

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

    本教程适用于Windows系统 从浏览器上打开本地程序,主要用到了本地URL协议,其实主要就是改注册表 先建立一个项目,我建的是控制台项目 在Program.cs写2个静态方法用来添加注册表.移除注册 ...

  2. 【转载】Chrome使用自定义协议打开本地程序并运行IE打开网页

    部分内容转载自: http://blog.sina.com.cn/s/blog_e2b8213a0102wqby.html 项目中遇到某需求:chorme要运行IE并打开网页.解决方案之一就是通过自定 ...

  3. html JS 打开本地程序及文件

    在网页打开本地应用程序示例: 一.在本地注册表自定义协议:以自定义调用Viso为例 1.在HKEY_CLASSES_ROOT下添加项ZVISIO. 2.修改ZVISIO项下的"(默认)&qu ...

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

    近期方有这样的要求:这两个系统,根据一组Chrome开展,根据一组IE开展,需要Chrome添加一个链接,然后进入IE该系统的开发.这,需要Chrome跳转到创建一个链接IE浏览器指定的页面.同时也实 ...

  5. 第十三篇 JS 操作table表格

    JS 操作table表格 这节课难度可能高一点,因为没有提前解释if判断.for循环.这节课是直接把这两样用上了,老师先简单介绍一下: if,判断语句,判断就很简单了嘛,假如说1=1(1等于1),当然 ...

  6. 第五十六篇、OC打开本地和网络上的word、ppt、excel、text等文件

    iOS打开本地和网络上的word.ppt.excel.text等文件 iOS开发过程中可能需要预览一些文件,这些文件的格式可能有word.ppt.excel等文件格式.那么系统提供两个类去预览这些文件 ...

  7. JS IE 打开本地exe程序

    例: try{ //新建一个ActiveXObject对象 var exe = new ActiveXObject("wscript.shell"); var exePath = ...

  8. JS实现打开本地文件或文件夹 ActiveXObject

    IE浏览器打开C盘,测试可用. 如果浏览器报错提示:ActiveXObject is not defined Internet 选项 -> 安全 - >安全级别,调低级别 function ...

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

    原网址:http://blog.csdn.net/cofesun/article/details/7904887javascript有个特殊的对象ActiveXObject,通过它可以访问window ...

随机推荐

  1. LED操作

    灯上拉 GPIO_InitTypeDef GPIO_InitStruct; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); GPIO_InitS ...

  2. 【lucene系列学习四】使用IKAnalyzer分词器实现敏感词和停用词过滤

    Lucene自带的中文分词器SmartChineseAnalyzer不太好扩展,于是我用了IKAnalyzer来进行敏感词和停用词的过滤. 首先,下载IKAnalyzer,我下载了 然后,由于IKAn ...

  3. 解决 MySQL 分页数据错乱重复

    前言 一天,小明兴匆匆的在通讯工具上说:这边线上出现了个奇怪的问题,麻烦 DBA 大大鉴定下,执行语句 select xx from table_name wheere xxx order by 字段 ...

  4. AngularJS2基本构造

    2.NG2入门 2.1 基本构造 angularjs主要有8个构造快: 模块(module) 组件(component) 模板(template) 元数据(metadata) 数据绑定(data bi ...

  5. 北漂面试经历(一(两)年工作经验)-- Java基础部分

    Java基础部分 常量和变量的区别:final 关键词修饰的变量是恒定不变的,如果还有static关键词修饰的话,常常称为编译期常量.变量,运行时可以修改其引用. Java基本类似有哪些 1 Byte ...

  6. python之基础中的基础(三)

    1.类,类就像是负责特定项目的主管,交给主管干这件事情,主管可以让手下的人分别去完成自己该干的活,最后综合起来把结果交给主管传递出去,即完成任务. class Dog(): ""& ...

  7. Integer浅谈

    别BB,亮代码. 结果: 结果分析: 1.true 相信大家对第一个的比较结果应该不意外,只是单纯的数值比较 2.true 这个和第三个结果一比较起来就感觉迷惑了,明明两个都是同样的赋值方式,为什么一 ...

  8. OC中@class的使用

    作用: 可以简单地引用一个类简单使用@class Dog; //类的引入 #import "Dog.h"仅仅是告诉编译器:Dog是一个类;并不会包含Dog这个类的所有内容 具体使用 ...

  9. Android开发之布局--RelativeLayout布局

    RelativeLayout 相对布局 true或false属性 Layout_centerHorizontal   当控件位于父控件的横向中间位置 Layout_centerVertical   当 ...

  10. 项目自动构建工具对比(Maven、Gradle、Ant)

    Java世界中主要有三大构建工具:Ant.Maven和Gradle.经过几年的发展,Ant几乎销声匿迹.Maven也日薄西山,而Gradle的发展则如日中天. Maven的主要功能主要分为5点,分别是 ...