-
js调用本地程序资源-兼容所有浏览器
在网页上通过JavaScript调用本地程序,兼容IE8/9/10/11、Opera、Chrome、Safari、Firefox等所有浏览器,在做Web开发时经常会遇到需要调用本地的一些exe或者dll程序,比如身份证读卡器,打印机等设备。
传统方式通过Activex控件,但这种方式只针对IE浏览器,并且在IE11之后Microsoft Edge浏览器中,微软也不在支持Activex控件了。因此想到了利用Websocket以及Http长链接方式来实现网页对本地资源程序的调用。
通过c#创建一个winform的客户端程序开启Websocket以及Http请求监听程序,在js中判断浏览器支持Websocket,则通过Websocket与本地程序通信,如果浏览器不支持Websocket(比如IE8/9)则自动采用Http长链接实现通信。
支持功能:心跳检测,断开重连,客户端版本检测,在一个页面可同时给客户端发送多个请求任务。每一次SocketCall调用都会生成一个唯一的任务Id,在断开重连等情况下能保证任务不丢失。
js调用示例
1
2
3
4
5
6
7
8
9
10
|
SocketCall(path, sendMsg, function (data) { //客户端返回回调方法 console.log( "返回结果:" + JSON.stringify(data)); }, function (msg, isHeart) { //调用消息的输出,比如心跳检测,错误消息 console.log(msg); }); |
js代码-自动识别通信方式
/* * 本地资源调用封装 * url: 调用地址 不需要主机和端口,例如:/yb * data: 输入参数 * callback: 成功回调函数,函数签名为 function(data), data参数为服务端返回对象{"Code":1,"Msg":"","Data":null} * output: 日志输出函数,函数签名为 function(msg,isHeart), msg输出字符串 isHeart是否心跳,重试消息 */ function SocketCall(url, data, callback, output) { //输入参数json序列号 if (typeof data == "object" && typeof (data) != null) { data = JSON.stringify(data); } //发送请求 if ('WebSocket' in window) { return new WSocket(url, data, callback, output); } else { return new HttpSocket(url, data, callback, output); } }
js代码-websocket调用封装

js代码-http长链接调用封装



客户端程序
客户端采用c#,winform实现,采用.netframework4.0版本,支持xp,win7,win10等操作系统。websocket实现采用的是开源项目:websocket-sharp.dll


在c#中,自定义消息处理类,只需自己新建一个类,然后继承至BaseHandler,并实现HandlerTask方法,比如:
/// <summary> /// 消息处理器 /// </summary> [HandlerAttribute("yb")]//对应websocket或者http请求路径,比如:ws:127.0.0.1:3964/yb 或者: http://127.0.0.1:3964/yb public class YBHandler : BaseHandler { /// <summary> /// 处理消息 /// </summary> /// <param name="msg"></param> /// <returns></returns> public override void HandlerTask(string msg) { //Thread.Sleep(20000); FrmTest frm = new FrmTest(); frm.TopMost = true; frm.ShowDialog(); //在子类中通过调用父类的ReturnToClient方法将消息json对象返回给网页 this.ReturnToClient(new WSResModel(ResCode.OK, DateTime.Now.ToString("HH:mm:ss") + "OK:" + msg)); } }
结语
源代码托管于GitHub,供大伙学习参考,项目地址:https://github.com/keguoquan/JsCallExe。感兴趣或觉得不错的望赏个star,不胜感激!
若能顺手点个赞,更加感谢!
文章出处:https://www.cnblogs.com/keguoquan/p/14524984.html