3

我想在 Web 视图上显示来自 telnet 界面的数据。我有一个守护进程正在运行,它读取 CAN 总线数据并在 telnet 端口上每秒生成约 500 行约 40 个字符。这是一些以 100 Hz 运行的消息,而大多数其他消息以 10 或 5 Hz 运行,因此总而言之约为 500 条/秒。我想获取每个数据包中的最新值并将其显示在网页上。网页在本地加载(不是通过 HTTP),并且守护程序可能位于不同的主机上,因此存在跨域通信。

这是我尝试过但没有做的事情:

  1. 使用 XMLHttpRequest。我可以打开连接并读取数据,但是当我收到 onprogress 事件时,我无法清除先前值的 responseText 字段。我无法解析 responseText 的最新值,因为它增长得非常快。我也会遇到内存问题,所以这是不行的。
  2. WebSockets 和 Socket.IO:两者都没有成功连接到 telnet 接口,因为它首先期望 HTTP 然后转换为直接套接字。

所以我的问题是,我怎样才能最好地做到这一点?我看到了一些选项,但我确信还有更多:

  1. 在我尝试附加的 canlogserver 守护程序中添加 HTTP 到套接字转换。如何?(它是开源 C,所以我可以添加它)
  2. 编写一个 PHP 接口,该接口通过 telnet 连接到守护进程,并可以通过 HTTP 将数据泵回 Web 视图。多次访问 IP 堆栈时,这似乎效率极低。<
  3. JS 客户端代码上还有什么其他内容可以规避我的缓冲区问题并从 telnet 服务器读取消息、显示数据然后转储缓冲区吗?我需要确保在打开套接字后收到所有消息,因此打开、关闭、重新打开将不起作用,因为这意味着消息会丢失。

谢谢,

蒂姆

4

2 回答 2

2

实际上,WebSockets 有一个类似 HTTP 的握手,然后为每条消息有一些框架(握手后它们不是原始套接字)。

但是,您可以使用websockify在 WebSocket 客户端(浏览器)和普通 TCP 套接字之间进行桥接。即使 WebSocket 协议(例如 Hixie)或浏览器不直接支持二进制类型(例如 Typed Arrays),Websockify 也使您能够向 TCP 服务器发送/接收二进制数据。

noVNC使用 websockify 能够直接连接到还没有内置 WebSocket 支持的 VNC 服务器。Websockify 甚至包含一个小测试,演示将基于浏览器的简单终端仿真器连接到 telnetd 服务器。免责声明:我制作了 websockify 和 noVNC。

于 2012-04-04T21:38:49.403 回答
1

如果您想要没有任何插件的纯 HTML5,最好的解决方案是使用 WebSockets。请记住此类技术支持的浏览器,您可以在此处找到支持的浏览器列表和协议版本。

WebSockets 必须在建立连接时进行握手,通常是 http 行。之后,所有消息都应该有框架,何时接收和何时发送。浏览器会自动执行此操作,但您必须为您的守护进程实现此功能。

有现成的解决方案,取决于您使用的语言。

如果您希望自己实现 WebSockets 协议,请查看 Java 实现的源代码,并使用官方规范:RFC6455

我相信 WebSockets 是最好的方法。Java/Silverlight/Flash 可能是其他解决方案,但它需要更多的努力并且可能不像 WebSockets 实现那样容易扩展,这将只是处理消息并在另一个 DIV 容器中创建 DOM 元素,如 DIV 接收到的消息。

于 2012-04-05T09:04:18.903 回答