第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 = ; //设置返回给客服端http状态代码
writer.Write(reciveInfo.name + "启动成功");
}
catch (ArgumentException e)
{
ctx.Response.StatusCode = ;
writer.Write("参数有误:" + e.Message);
}
catch (Exception e)
{
ctx.Response.StatusCode = ;
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>
启动后,运行截图如下:

第45篇 js操作打开本地程序的更多相关文章
- C#注册URL协议,使用浏览器打开本地程序,类似网页上点了QQ交谈打开本地QQ客户端程序
本教程适用于Windows系统 从浏览器上打开本地程序,主要用到了本地URL协议,其实主要就是改注册表 先建立一个项目,我建的是控制台项目 在Program.cs写2个静态方法用来添加注册表.移除注册 ...
- 【转载】Chrome使用自定义协议打开本地程序并运行IE打开网页
部分内容转载自: http://blog.sina.com.cn/s/blog_e2b8213a0102wqby.html 项目中遇到某需求:chorme要运行IE并打开网页.解决方案之一就是通过自定 ...
- html JS 打开本地程序及文件
在网页打开本地应用程序示例: 一.在本地注册表自定义协议:以自定义调用Viso为例 1.在HKEY_CLASSES_ROOT下添加项ZVISIO. 2.修改ZVISIO项下的"(默认)&qu ...
- 通过私有协议Chrome浏览器页面打开本地程序
近期方有这样的要求:这两个系统,根据一组Chrome开展,根据一组IE开展,需要Chrome添加一个链接,然后进入IE该系统的开发.这,需要Chrome跳转到创建一个链接IE浏览器指定的页面.同时也实 ...
- 第十三篇 JS 操作table表格
JS 操作table表格 这节课难度可能高一点,因为没有提前解释if判断.for循环.这节课是直接把这两样用上了,老师先简单介绍一下: if,判断语句,判断就很简单了嘛,假如说1=1(1等于1),当然 ...
- 第五十六篇、OC打开本地和网络上的word、ppt、excel、text等文件
iOS打开本地和网络上的word.ppt.excel.text等文件 iOS开发过程中可能需要预览一些文件,这些文件的格式可能有word.ppt.excel等文件格式.那么系统提供两个类去预览这些文件 ...
- JS IE 打开本地exe程序
例: try{ //新建一个ActiveXObject对象 var exe = new ActiveXObject("wscript.shell"); var exePath = ...
- JS实现打开本地文件或文件夹 ActiveXObject
IE浏览器打开C盘,测试可用. 如果浏览器报错提示:ActiveXObject is not defined Internet 选项 -> 安全 - >安全级别,调低级别 function ...
- js实现打开本地文件或文件夹
原网址:http://blog.csdn.net/cofesun/article/details/7904887javascript有个特殊的对象ActiveXObject,通过它可以访问window ...
随机推荐
- Unity调用Android的两个方式:其一、调用jar包
unity在Android端开发的时候,免不了要调用Java:Unity可以通过两种方式来调用Android:一是调用jar.二是调用aar. 这篇文章主要讲解怎么从无到有的生成一个jar包,然后un ...
- React-Native 之 redux 与 react-redux
前言 本文 有配套视频,可以酌情观看. 文中内容因各人理解不同,可能会有所偏差,欢迎朋友们联系我讨论. 文中所有内容仅供学习交流之用,不可用于商业用途,如因此引起的相关法律法规责任,与我无关,如文中内 ...
- C语言的一些基础
一.C语言基础: 1.1.main函数是入口函数,用于进行link. 1.2..sln是解决方案的管理文件. 1.3.int:32位.short:16位.long:32位.long long:64位. ...
- WebService应用--使用java开发WebService程序
使用Eclipse开发第一个WebService程序,本示例采用的工具为Spring-Tool-Suite,和Eclipse没有本质的区别,开发环境jdk1.7 一.开发步骤: 1.新建名为WebSe ...
- Windows7系统的封装
系统装到虚拟机优化完成以后,可以装上自己想要装的软件,也可以不装做个纯净版的.今天用ES封装,首先打开一般我们只点这四项就够了,如下图 写上自己想写的,也可以不写系统默认,直接点“下一步”关闭设备管理 ...
- 通过 bootloader 向其传输启动参数
作者:Younger Liu, 本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可. Linux提供了一种通过bootloader向其传输启动参数的功能,内核开发 ...
- SVM流行库LIBSvm的使用和调参
简介:Libsvm is a simple, easy-to-use, and efficient software for SVM classification and regression. It ...
- java实现对服务器的自动巡检邮件通知
1.需求 之前一直是手动的巡检,然后贴图,最近服务器数量大增,有点忙不过来了.因为一直用的java,对shell脚本不是特别了解,所以这次用java写了个小项目,实现对多服务器,多任务的巡检,巡检结果 ...
- HTTP协议详解以及URL具体访问过程
1.简介 1.1.HTTP协议是什么? 即超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵守这个标准.从 ...
- Java发布一个简单 webservice应用 并发送SOAP请求
一.创建并发布一个简单的webservice应用 1.webservice 代码: package com.ls.demo; import javax.jws.WebMethod; import ja ...