3

Вопрос по websocket – Лучший способ отобразить высокоскоростные данные из интерфейса telnet в веб-представлении?

Я хотел бы отображать данные, поступающие из интерфейса telnet, в веб-представлении. У меня работает демон, который читает данные шины CAN и выдает около 500 строк по ~ 40 символов в секунду на порт telnet. Это несколько сообщений, работающих на частоте 100 Гц, и большинство других, работающих на частоте 10 или 5 Гц, так что в сумме это около 500 в секунду. Я хочу получить последние значения в каждом пакете и отобразить их на веб-странице. Веб-страница загружается локально (не через HTTP), и демон может находиться на другом хосте, поэтому существует междоменная связь.

Вот что я пытался и не смог сделать:

  1. Use XMLHttpRequest. I can open the connection and read the data, but I can't clear the responseText field of prior values when I get the onprogress event. I can't afford to parse the responseText for the latest value as this grows very quickly. I will also run into memory issues, so this is a no-go.
  2. WebSockets and Socket.IO: neither has proved successful in connecting to a telnet interface because it expects HTTP at first to then convert to direct socket.

Итак, мой вопрос, как мне лучше всего это сделать? Я вижу некоторые варианты, но я уверен, что есть еще:

  1. Add HTTP to socket conversion in the canlogserver daemon I'm trying to attach to. How? (it's open source C so I could add to it)
  2. Write a PHP interface which attaches to the daemon via telnet and can pump data back to web view via HTTP. This seems grossly inefficient with multiple trips through the IP stack.<
  3. Anything else on the JS client code to circumvent my buffer issue and read messages from telnet server, display data and then dump the buffer? I need to make sure I get all the messages once the socket is opened, so opening, closing, reopening won't work since that will mean messages are lost.

Спасибо,

Тим

  • 2

    На самом деле

    WebSockets имеет HTTP-подобное рукопожатие, а затем имеет некоторые кадры для каждого сообщения (они не являются необработанными сокетами после рукопожатия).

    Тем не менее, вы могли бы использоватьwebsockify для моста между клиентом WebSocket (браузером) и обычным сокетом TCP. Websockify также позволяет отправлять / получать двоичные данные на / с TCP-сервера, даже если протокол WebSocket (например, Hixie) или браузер не поддерживает двоичные типы напрямую (например, типизированные массивы).

    noVNC использует websockify для прямого подключения к серверу VNC, который еще не имеет встроенной поддержки WebSocket. В Websockify даже включен небольшой тест, демонстрирующий подключение простого эмулятора терминала на основе браузера к серверу telnetd.Disclaimer: Я сделал websockify и noVNC.

  • 1

    Лучшее решение - использовать WebSockets

    если вы хотите чистый HTML5 без каких-либо плагинов. Принимая во внимание поддерживаемые браузеры для такой технологии, вы можете найтисписок поддерживаемых браузеров и версия протокола здесь.

    WebSockets должны делать рукопожатие, когда соединение установлено, это обычные http строки. После этого все сообщения должны иметь рамку, когда получать и когда отправлять. Браузер делает это автоматически, но вы должны реализовать для этого демона эту функцию.

    Есть готовые решения, зависит от того, какой язык вы используете.

    Если вы хотите реализовать протокол WebSockets самостоятельно, проверьте источники реализации Java, например, и используйте официальную спецификацию:RFC6455

    Я считаю, что WebSockets - лучший путь. Java / Silverlight / Flash может быть другим решением, но оно требует больше усилий и может не быть легко масштабируемым, как реализация WebSockets, которая будет просто обрабатывать сообщения и создавать элементы DOM, такие как DIV, в другом контейнере DIV с полученными сообщениями.