(1)伺服器端的一个exe程序向web程序发送数据,web程序要知被通知的时候再将结果呈现在浏览器上的web页面上。

(2)从浏览器web页面上按下按钮后,要让伺服器端的一个exe知道,有些东西变了ps. web小程序和伺服器端的一个exe程序都是我准备编写的。不知道如何下手,以前用php+mysql编过网站,不过感觉这个问题的需求貌似不需要资料库,就是说有人浏览网页,数据的来源都是要询问那个伺服器端的一个exe程序才能得到(至于exe从哪里拿数据,web程序就不知道了)。怎么弄呢?听说HTML5有push的技术,能否指点下? 另外 伺服器端的一个exe程序是准备用C++编。

&

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


看到这么多「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合适得多。

虽说是要感谢邀请,可首先我还是想吐槽一下:这个需求描述看得混乱不堪哪。我只能按我大致的理解总结一下需求。@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也可以)。比如「抬起机械臂」被映射为:http://server.locahost/raise/arm/0,则B类数据源对应的可能是一个命令行 machineArmOp.exe -ID 0 -Action Raise 。
  2. 伺服器必须是一个web app,用以分析客户端请求的URL字元串并翻译为数据源认识的操作。基本上几种常用的web伺服器端语言都能干这事儿,http://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,命名管道等等)和伺服器通信。


这个应该用服务端推送技术就行。google之。

猜想LZ从事嵌入式开发,对网路应用不熟悉。如果是的话应该尽量使用现有的网路开发工具,核心代码不超过10行

1、浏览器使用javascript轮询状态和执行命令

setinterval(function(){ jQuery.get(/status); }, 100); jQuery.post(/destroy_the_earth); 2、伺服器(例如PHP页面)通过系统命令与桌面程序互动 & &
TCP通信不行吗exe程序做成server端web做成客户端
nodejs支持c++的扩展,也很容易做web伺服器。
flash 的 XMLSocket 好像也可以
推荐阅读:
相关文章