作为诊断页面的一部分,我希望用户能够运行“ping”,即一个普通的 shell 命令,将 ICMP_ECHO_REQUST 发送到某个 IP,并在浏览器的 div 中动态显示结果。
后端是 Ruby/Rails。
我已经在服务器端运行该命令并读取 ping 命令的输出。
我一直在构建定期回调服务器以动态更新页面某些部分的网页。
但在这种情况下,存在三个挑战:
- 能够让 ajax 回调 uri/url 来查找运行 ping 命令的进程
- 理想情况下,当 ping 命令返回新的数据行时能够更新页面
- 可以选择“中断” ping。通过 ping,我当然可以将选项设置为仅发送 x ping,然后退出,从而无需停止该进程。但我还有另一个工具,即日志查看器,并且该工具不会在一定行数后自行停止,而是在不中断的情况下永远继续,即使用 Control-C。
我是否设置一个内存缓存来与运行 ping 的进程会合,或者是否有更简单的方法?
我搜索了很多,认为这应该是一个足够常见的问题,有一个 Rails 插件可以神奇地实现所需的功能,但我根本没有找到太多。
有什么建议或指示吗?
如果我理解正确的话,您想要的通常是从客户端的网络服务器接收一些信息,而客户端不知道该信息到底何时传入,即pushing从网络服务器到客户端的信息。有几种方法可以做到这一点,但它们都有一些缺点:
- HTTP 推送 - 需要保持活动连接,并且服务器以分块方式持续发送信息,每次都宣布下一个块传入,直到准备好才发送。通常,这个“chucked 流”要么在 XMLHttpRequest 对象中接收,要么在隐藏的 iframe 中接收,尽管如果需要的话可以将其按原样显示给用户(如您的情况)。
- 轮询 - 客户端只是询问服务器是否有定期传入的内容。令人望而生畏,具有巨大的消息传递延迟,而且是一个流量大户,但几乎总是有效。
- 长轮询 - 轮询和 HTTP 推送的组合 - 即轮询后的第一个答案被延迟,直到有需要回答的内容为止。
-
服务器发送的事件 (SSE) http://dev.w3.org/html5/eventsource/- 一个几乎被接受的标准,在 Opera 中实施了很长时间,现在许多浏览器都支持它,并且它的目标是成为 W3C 标准。
- WebSockets 也是 Google 新提出的标准,允许通过 Javascript 进行更复杂的 TCP 连接和发送/接收功能。它还可以用于 HTTP 推送。
- 使用非 HTML 方法(即 Flash、Java、Silverlight)获取传入内容。有一些库/现成的模块化 SWF/小程序(例如,BlazeDS http://opensource.adobe.com/wiki/display/blazeds/BlazeDS)可用于此目的,例如,它可以从给定连接传输信息以在目标页面上以 JSON 形式执行。
所有这些方法确实都包含在总括术语“HTTP 推送”和“comet”中。有大量文档、教程和现有解决方案。例如,对于RoR,您可以尝试主宰 http://juggernaut.rubyforge.org/ or 射击之星 http://rubyforge.org/forum/forum.php?forum_id=16618,或者只是选择简约的解决方案 http://splinter.com.au/blog/?p=43.
最后,我想推荐 Gregor Roth 的一篇精彩文章上交所(第 1 部分) http://today.java.net/article/2010/03/31/html5-server-push-technologies-part-1 and WebSocket(第 2 部分) http://today.java.net/article/2010/04/26/html5-server-push-technologies-part-2其中给出了详细的解释、示例和使用前景。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)