欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  web前端

如何写一个 web 程序和服务器端的一个 exe 程序进行通信?

程序员文章站 2022-04-05 16:12:53
...
(1)服务器端的一个exe程序向web程序发送数据,web程序要知被通知的时候再将结果呈现在浏览器上的web页面上。
(2)从浏览器web页面上按下按钮后,要让服务器端的一个exe知道,有些东西变了
ps. web小程序和服务器端的一个exe程序都是我准备编写的。不知道如何下手,以前用php+mysql编过网站,不过感觉这个问题的需求貌似不需要数据库,就是说有人浏览网页,数据的来源都是要询问那个服务器端的一个exe程序才能得到(至于exe从哪里拿数据,web程序就不知道了)。怎么弄呢?听说HTML5有push的技术,能否指点下? 另外 服务器端的一个exe程序是准备用C++编。

需求是这样的:
现在有一个桌面应用程序正在控制一个机械臂,现在希望通过浏览器控制(借由此可以用平板控制了,平板上的浏览器),当然机械臂每一刻的状态,以及具体的控制程序都是由桌面应用程序exe控制的,现在就是不知道服务器如何和这个exe程序通信呢?

回复内容:

虽说是要感谢邀请,可首先我还是想吐槽一下:这个需求描述看得混乱不堪哪。我只能按我大致的理解总结一下需求。@Edwin,如果有不对请指出。

现在看来需求大约是这样:某程序有三个组成部分:
  1. 数据源:这个数据源是一个可执行程序,工作在服务器端。它负责从本需求里不可知的来源负责实际操作。
  2. 服务器:这个服务器是web服务器,用来提供网页上的操作接口控制数据源。服务器接受客户端传来的web请求并转换为数据源可以识别的操作。
  3. 客户端:浏览器页面作为客户端将web请求发送到服务器端。每个web请求对应一个数据端的操作。
这里有两个交互,1-2,2-3。我现在的理解是楼主两个都不知道怎么做。@杨帆 的回答完整地覆盖了2-3,但1-2却没有回答。

我对web没概念,所以我大约能回答的是1-2。但是回答之前我们必须继续澄清几个问题:

  1. 数据源。这个程序提供什么样的接口?一般能有的是两种:A:这个程序以服务的形式启动,并通过某个进程间通信技术收发命令(命名管道,socket等等);B:这个程序是一个单纯的命令行,每次执行一次命令行并通过参数确定要具体执行的操作。当然,这里每个类型还有一个变种,即操作发出后是立即返回(代号0),还是等操作真正结束时才返回(代号1),即请求是否被阻塞。所以一共加起来一共是四种接口:A0,A1,B0,B1。
  2. 客户端。客户端是否支持异步提交请求?比如页面上显示一个按钮表示“抬起机械臂”,用户点击后是操作立即返回还是等待机械臂确实抬起之后才返回?
这两个需求搞清楚了才能给方案。大体上需要考虑的问题如下:
  1. 我们必须把数据源认识的请求类型映射为HTTP URL(时尚点叫Restful也可以)。比如“抬起机械臂”被映射为:server.locahost/raise/a,则B类数据源对应的可能是一个命令行 machineArmOp.exe -ID 0 -Action Raise 。
  2. 服务器必须是一个web app,用以分析客户端请求的URL字符串并翻译为数据源认识的操作。基本上几种常用的web服务器端语言都能干这事儿,ASP.NET或PHP或借助web框架的Python。
  3. 如果数据源是A类,也就是说它具备远程通信的能力,那么数据源必须和服务器同时启动。Web app 通过语言能提供的接口和数据源通信。如果数据源是A1,那么还需要一个单独的步骤,即通信发起时最好分在另一个线程或通过select()/poll()防止服务器阻塞。
  4. 如果数据源是B类,也就是说它只是一个命令行,那么Web App需要使用系统提供的接口,比如system(),exec(),CreateProcess()等创建子进程并解析其返回码或标准输出/标准错误的输出信息。同样地,服务器Web app可能需要多线程来处置B1类以防止服务器端阻塞。
  5. 客户端根据其是否需要阻塞,可以使用Ajax。这一点@杨帆 的回答已经很清楚了。
另外一个特殊情况是我们不能排除这样的可能,即我们需要为B1类数据源编写一个包装。这个包装也以服务的形式常驻系统,它负责提供一个协议(socket,命名管道等等)和服务器通信。 看到这么多“exe程序”看得头疼,LZ是做C出身的?但是linux下哪有什么exe。。。

看了半天我大概弄懂了,就是服务器的推技术。
网上这种资料很多,详细的可以google之。

html5时代,web socket可以解决这个问题,但是很显然,现在时机还不成熟。
而在html5之前,普遍的方式是利用不断的pull来模拟。

常用的方式有两种
1.利用不间断的ajax长轮询:在页面建立起一个超时时间很长的ajax连接到服务器,服务器并不返回消息,这个ajax就会被阻塞住,一旦成功返回消息或是超时,就再建立起一个ajax连接,这样就可以模拟出push的效果。
你可以用firebug看看知乎的ajax请求,通知和首页的更新好像都用到了这种方式。

2.利用iframe标签:在页面建立动态的iframe标签,将src指向到一个服务器连接,服务器同样不返回消息,这个iframe就会显示一直在加载,这种也同样可以模拟push的效果。
早年gmail就是这么实现的,不过要处理页面状态条一直显示“正在连接”的问题比较麻烦。

至于你说的(2),就简单了,按下按钮,浮起事件,发送ajax请求。

看你提到了php+mysql,php在处理长连接的问题上是非常不适合的,特别是与apache搭配的时候(因为一次请求,全部清空的特点)。

又看到你标签打了nodejs,是的,nodejs的非阻塞的异步特性在处理长连接的问题上比apache+php合适得多。 猜想LZ从事嵌入式开发,对网络应用不熟悉。如果是的话应该尽量使用现有的网络开发工具,核心代码不超过10行

1、浏览器使用javascript轮询状态和执行命令
setinterval(function(){ jQuery.get('/status'); }, 100);
jQuery.post('/destroy_the_earth');

2、服务器(例如PHP页面)通过系统命令与桌面程序互动

这个应该用服务端推送技术就行。google之。 用HTML5的web socket应该可以 TCP通信不行吗
exe程序做成server端
web做成客户端 nodejs支持c++的扩展,也很容易做web服务器。 flash 的 XMLSocket 好像也可以