VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > temp > C#教程 >
  • 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调用封装

 webscoket调用封装

 

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

 http调用封装

 

 Ajax调用

 

 其他相关js方法

 

客户端程序

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

 WebSocket服务主类

 

 WebSocket消息处理类

 

在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


相关教程