前言 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;但是这种技术有诸多弊端。新的浏览器已不支持该协议。本文探讨了另一种交互技术,这种技术平台限制小,绝大多数浏览器都能支持,是值得推广的一项技术。

windows平台下,web与app交互方式探索的更多相关文章

  1. 在Windows平台下Qt的exe报错问题排查步骤

    在Windows平台下Qt的exe报错问题排查步骤 工具介绍: 1. Dependency Worker Dependency Worker是一个免费的用具用来扫描任何的32bit 或者64bit 的 ...

  2. Mac平台与Windows平台下AndroidStudio增量升级

    Android Studio增量升级什么情况下使用最合适呢? 比如现在的as版本是2.2版本,而你的as版本2.0版本,这个时候点Check For Updates就没有反应了,因为你已经2个有版本没 ...

  3. Windows平台下的node.js安装

    Windows平台下的node.js安装 直接去nodejs的官网http://nodejs.org/上下载nodejs安装程序,双击安装就可以了 测试安装是否成功: 在命令行输入 node –v 应 ...

  4. windows平台下nginx+PHP环境安装

    因为日常工作在windows下,为方便在window是下进行PHP开发,需要在windows平台下搭建PHP开发环境,web服务器选择nginx,不过windows版本的nginx性能要比Linux/ ...

  5. Windows平台下Oracle实例启动过程中日志输出

    Windows平台下Oracle实例启动过程中日志输出记录. 路径:D:\app\Administrator\diag\rdbms\orcl\orcl\trace\alert_orcl.log 输出内 ...

  6. Windows平台下Oracle监听服务启动过程中日志输出

    Windows平台下Oracle监听服务启动过程中日志输出记录. 日志目录:D:\app\Administrator\diag\tnslsnr\WIN-RU03CB21QGA\listener\tra ...

  7. 利用zabbix监控ogg进程(Windows平台下)

    本文给大家介绍如何监控windows平台下的ogg程序.(注:所有操作都在administrator用户下面进行操作) 监控linux平台下的ogg程序请看:https://www.cnblogs.c ...

  8. [转]Windows平台下Makefile学习笔记

    Windows平台下Makefile学习笔记(一) 作者:朱金灿 来源:http://blog.csdn.net/clever101 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译 ...

  9. Windows平台下Git服务器搭建

    第一步:下载Java,下载地址:http://www.java.com/zh_CN/ 第二步:安装Java.安装步骤不再详述. 第三步:配置Java环境变量. 右键”计算机” => ”属性” = ...

  10. Windows平台下PHP开发环境的配置

    Windows平台下PHP开发环境的配置 一.基本环境 1.Windows XP 32位 2.Apache 2.2.25,下载地址:http://mirror.bit.edu.cn/apache/ht ...

随机推荐

  1. Windows 非服务器版本永久关闭命令行“快速编辑模式”

    使用管理员权限运行cmd.exe 运行如下命令: reg add HKEY_CURRENT_USER\Console /v QuickEdit /t REG_DWORD /d 00000000 /f

  2. C221110C. SolarPea与网格

    C221110C. SolarPea与网格 是怎么想到dp定义的? 思考下面这个情景: 如果一个人在 \(x\), 另一个人在 \(y \ (x \lt y)\), 那么在 \(x\) 的人会把 \( ...

  3. .NET 高性能异步套接字库,支持多协议、跨平台、高并发

    前言 .NET 生态中有哪些值得推荐的网络通信框架?今天,给大家推荐一个非常优秀的开源项目--NetCoreServer. NetCoreServer 是一款 .NET 开源.免费.快速且低延迟的异步 ...

  4. 给 Ollama 穿上 GPT 的外衣

    上一篇我们介绍了如何在本地部署 ollama 运行 llama3 大模型.过程是相当简单的.但是现在给大模型交流只能在命令行窗口进行.这样的话就只能你自己玩了.独乐乐不如众乐乐嘛.我们接下来说一下如何 ...

  5. 干货分享:Air700ECQ的硬件设计,第一部分

    ​ 一.绪论 Air700ECQ是一款基于移芯EC716E平台设计的LTE Cat 1无线通信模组.支持移动双模FDD-LTE/TDD-LTE的4G远距离无线传输技术.以极小封装,极高性价比,满足Io ...

  6. python3的json数据库-TinyDB初入门

    无意间看到TinyDB这个词汇,就去查了一下,就发现了它的官方网站 这里 然后就是按照他说的步骤去做. 第1步 安装  pip3 install tinydb 安装成功后,创建一个文件名字叫做 tes ...

  7. 读书笔记-C#8.0本质论-04

    18. 多线程 18.1 多线程基础 处理器受限延迟(Processor-bound latency):假定一个计算需要执行120亿次算术运算,而总共的处理能力是每秒60亿次,那么从请求结果到获得结果 ...

  8. golang之枚举类型iota

    枚举类型是一种常用的数据类型,用于表示一组有限的.预定义的.具名的常量值.在枚举类型中,每个常量都是一个枚举值,它们之间的值相等且唯一. 枚举类型通常用于表示一组相关的常量,比如星期.月份.性别等等. ...

  9. python之异步任务框架Celery

    官网参考: Celery 官网:http://www.celeryproject.org/ Celery 官方文档英文版:http://docs.celeryproject.org/en/latest ...

  10. Winform Tab增加关闭标签页

    Winform的Tab控件,有新增有移除,但是呢,缺了一个标签页上的关闭按钮,这个东西说重要也重要,说不重要也不重要. 这里就说一下怎么添加这玩意. 这玩意需要重绘tab控件,所以我们需要处理Draw ...