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

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

WBOY
WBOYasal
2016-06-07 08:44:253173semak imbas

(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 好像也可以
Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn