一、背景
最近有一个新需求,是通过浏览器打开本地exe应用。因为我们公司的产品是以exe为主,用web项目管理数据,接到的新项目是web为企业门户需要集成所有的应用,前端通过按钮点击打开本地exe应用。一开始还有点懵,因为我做B/S很多年,但是从来没考虑或尝试从浏览器打开本地exe,但是技术呢,肯定是可以实现的,因为可以参考百度网盘,通过浏览器打开以后,下载东西,如果文件过大,会提示使用本地客户端下载,浏览器就会弹出对应窗口用来打开exe应用。所以技术路线肯定没问题,剩下的就是看怎么实现了。还是比较简单的,毕竟就是把双击的操作使用脚本代码来实现。
二、技术探索
1.单机应用考虑
一开始我一直以为是在本机使用的,所以很简单啊,本机启动浏览器,然后点击按钮,通过接口调用后端方法,后端方法实现打开本地exe应用即可。
接下来只要完成后端的功能接口即可,我先找了个demo来尝试通过java打开本地exe。实现有多种方式,代码呢也非常简单,几行代码即可。
以下也给出了2种实现方式:
方式一:
代码就2行
public static void main(String[] args) throws IOException {
String exePath = "C:\\Program Files\\Tencent\\QQNT\\QQ.exe";
Runtime.getRuntime().exec(exePath);
}
上面的地址要填你要打开应用的地址,如下图:
运行main方法就能打开QQ
方式二:
public static void main(String[] args){
String exePath = "C:\\Program Files\\Tencent\\QQNT\\QQ.exe";
BufferedReader br = null;
BufferedReader brError;
String line = null;
try {
Process p = new ProcessBuilder(exePath).start();
br = new BufferedReader(new InputStreamReader(p.getInputStream()));
brError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
while ((line = br.readLine()) != null || (line = brError.readLine()) != null) {
//输出exe输出的信息以及错误信息
System.out.println(line);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
运行程序,也可以打开。
至此单机版的实现。先说结论,这个不能够使用,因为存在严重的问题。我们的web门户系统是放在服务器上的(是公用的服务),客户端是有多个的,客户想要实现的是,从A电脑访问门户系统,点击打开exe应用按钮,就打开A电脑的exe。从B电脑访问门户系统,点击打开exe应用按钮,就打开B电脑的exe。。。其他也同理。所以单机版的就不能实现,他打开的永远是本机的exe应用,服务器首先不是windows系统的,其次服务器上也没装exe应用。放到服务器上连最基本的都不能实现。
2.服务器客户端考虑
经过分析,我觉得还是自己想的太简单了。如果要通过服务器,去打开本机的exe应用,那我想本机一定得有一个守护线程,并且这个服务是实时在线的,可能随本机启动而自启动,永远在线,等待服务器的调用,通过门户系统点击了打开本地exe按钮后,浏览器发送请求到守护线程的服务,守护线程去调用打开exe的方法。调起肯定是从浏览器发起了,协议选择了Websocket。至于为什么不选择http,是因为从服务器调用本机,服务器需要实时获取本机地址,并且拼接请求地址,比较复杂。Websocket使用协议不同,固定地址为本机(127.0.0.1)即可。点击打开exe按钮时建立连接,并发送调起exe应用的请求。
这种方法应该是可以实现的,但是再我们开始做的时候,又找到了更简单的方法。
3.注册表修改探索
新建文件,修改后缀为reg,使用NotPad++打开编辑。
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\TestQ]
@="TestQProtocol"
"URL Protocol"="\"C:\\Program Files\\Tencent\\QQNT\\QQ.exe\""
[HKEY_CLASSES_ROOT\TestQ\shell]
[HKEY_CLASSES_ROOT\TestQ\shell\open]
[HKEY_CLASSES_ROOT\TestQ\shell\open\command]
@="\"C:\\Program Files\\Tencent\\QQNT\\QQ.exe\""
双击运行即可。注意运行reg文件的时候,千万不用放到含中文路径的目录下!同时编码格式要用ANSI。
编码可以在notPad++中调整。
添加完成后,可以按win+R 输入 regedit 查看注册表信息。通过以上路径可以找到自己添加的。如果没生效可以重启电脑尝试。
然后打开浏览器输入:
testq://
至此通过浏览器打开客户端的问题解决。
建议:可以在本公司的exe应用程序安装的时候将注册表信息一块添加到电脑上。到时候直接浏览器访问即可。
三、最后
通过本次需求,学到了浏览器打开exe应用的技术,收益颇多。大家有类似需求的快试试吧。