zoukankan      html  css  js  c++  java
  • windows平台下,web与app交互方式探索

    前言 web与app孰优孰劣暂且不争论,也许一方永远代替不了另一方。一个系统有可能同时包含web和app;web和app紧密配合下,才能给用户更好的体验。web如何将信息传达给app?这就是本文要探索的话题。

    web与app交互包括两部分 : 1)web启动app。2) web与app交互数据。

    1 web启动app

      windows平台可以通过URL Protocol协议启动app。将app的信息写入注册表,web通过该协议就可以启动app,同时也可以传给app参数。其实,注册表已经包含大量该协议了,看下图:

     

     app需要按照规范,写入注册表信息。我写了一个函数,可以方便的完成该功能。

      const string UrlItemName = "openOfdDesign";
            private void WriteRegUrlProtocol()
            {
                string curFullPath = this.GetType().Assembly.Location;
                try
                {
                    RegistryKey keyRoot = Registry.ClassesRoot;
    
                    RegistryKey itemRootKey = keyRoot.CreateSubKey(UrlItemName);
                    itemRootKey.SetValue(string.Empty, UrlItemName+"Protocol");
                    itemRootKey.SetValue("URL Protocol", curFullPath);
    
                    RegistryKey itemDefaultIcon = itemRootKey.CreateSubKey("DefaultIcon");
                    itemDefaultIcon.SetValue(string.Empty, curFullPath+",1");
    
                    RegistryKey itemShell = itemRootKey.CreateSubKey("shell");
                    RegistryKey itemOpen = itemShell.CreateSubKey("open");
                    RegistryKey itemCommand = itemOpen.CreateSubKey("command");
    
                    string cmdValue = string.Format(""{0}" "%1"", curFullPath);
                    itemCommand.SetValue(string.Empty, cmdValue);
    
                    itemCommand.Close();
                    itemOpen.Close();
                    itemShell.Close();
                    itemDefaultIcon.Close();
                    itemRootKey.Close();
                }
                catch (Exception ex)
                {
                    MessageBox.Show("写注册表程序异常!"+ex.Message);
                }
            }
    

     注册表信息准备好后,web端就可以启动该app。代码很简单:

     <div>
           <a href="openOfdDesign://action=editOfd&ofdGuid=5041075d-a3d3-462e-b4b2-c3a9cfb18c8d">
                    启动 OfdDesign
             </a>
      </div>

    启动app时,也可以传给app一些参数。这些参数大小有限制,如果要传入大量数据,需要用到ajax。下文会介绍此方法。

    启动app的问题解决了,其实还有大量的细节问题值得我们思考。

    如何确保只启动一个app实例?

    web端每调用一次就会启动一个app实例,这种情况并不是我们想要的。我们想要的结果是:

    a) 如果程序没启动,启动程序,处理传入的参数。

    b) 程序已启动,不用启动新的app,现有程序处理传入的参数。

    对于 b)如何实现?

    我们确实无法控制app只启动一个app,每一次web调用,肯定会启动一个app实例。但是,实例启动后,我们就可以有所作为。假定实例a1已启动,现在启动了实例a2。a2启动后,检测到a1已启动;a2则将传入的参数发送a1,a2立即退出。

    两个实例a1和a2之间如何交互?

    需要用到两个技术:

    1)互斥锁 Mutex;这个比较简单,不再累述。

    2)   内存文件;

    内存文件其实和磁盘文件没啥区别,只是内存文件不占用磁盘空间,读写速度远超磁盘文件。读写内存文件时,要加锁,否则会出问题。紧接着的问题就是:内存文件的存放结构,怎么知道内存文件是否有数据?解决这些问题并不难,这里就不给出详细的解决方案了。

    2 web与app交互数据

    web可以通过ajax与app交互数据。app建立一个简单的http服务并不难。使用HttpListener就可以了。下文为启动监听代码:

     HttpListener _httpListener;
            public bool Start()
            {
                _httpListener = new HttpListener();
                //定义url及端口号,通常设置为配置文件
                _httpListener.Prefixes.Add(string.Format($"http://+:{ListenPort}/"));
                //启动监听器
                _httpListener.Start();
    
                for (int i = 0; i < 2; i++)
                {
                    Task.Factory.StartNew(() =>
                    {
                        WaitHttpRequest();
                    }, TaskCreationOptions.LongRunning);
                }
                // _httpListener.BeginGetContext(HttpCallback, null);
                return true;
            }

     后记 web和app各有优势,如何扬长避短,是我们常常要思考的问题。为了增强web的功能,老的技术是在浏览器中嵌入ocx;但是这种技术有诸多弊端。新的浏览器已不支持该协议。本文探讨了另一种交互技术,这种技术平台限制小,绝大多数浏览器都能支持,是值得推广的一项技术。

    专注.NET、VC++。擅长WPF、WinForm、Socket等技术。 技术交流 QQ群(618168615)
  • 相关阅读:
    Java Code Template
    FTP服务器文件上传的代码实现
    CentOS 7 安装vsftpd 服务器
    Nginx 403 forbidden的解决办法
    CentOS 7中使用iptables
    CentOS下安装Nginx服务器
    HTML5:web socket 和 web worker
    HTML5新增元素、标签总结
    js页面刷新之实现框架内外刷新(整体、局部)
    js页面刷新之实现定时刷新(定时器,meta)
  • 原文地址:https://www.cnblogs.com/yuanchenhui/p/web_run_app.html
Copyright © 2011-2022 走看看