3

Web ビューで telnet インターフェイスからのデータを表示したいと思います。CANバスデータを読み取り、telnetポートに毎秒約40文字の約500行を生成するデーモンを実行しています。100 Hz で実行されるいくつかのメッセージと、10 または 5 Hz で実行される他のほとんどのメッセージであるため、合計で約 500/秒です。各パケットの最新の値を取得して、Web ページに表示したいと考えています。Web ページは (HTTP 経由ではなく) ローカルに読み込まれ、デーモンは別のホストにある可能性があるため、クロスドメイン通信が行われます。

これが私が試して失敗したことです:

  1. XMLHttpRequest を使用します。接続を開いてデータを読み取ることはできますが、onprogress イベントを取得したときに、responseText フィールドの以前の値をクリアできません。これは非常に急速に大きくなるため、responseText を解析して最新の値を取得する余裕はありません。メモリの問題も発生するので、これは仕方ありません。
  2. WebSockets と Socket.IO: どちらも、まず HTTP が直接ソケットに変換されることを期待しているため、telnet インターフェースへの接続に成功していません。

だから私の質問は、どうすればこれを達成するのが最善ですか? いくつかのオプションが表示されますが、他にもあると確信しています。

  1. アタッチしようとしているcanlogserverデーモンにHTTPからソケットへの変換を追加します。どのように?(オープンソースのCなので、追加できます)
  2. telnet 経由でデーモンに接続し、HTTP 経由でデータを Web ビューに送り返すことができる PHP インターフェイスを作成します。これは、IP スタックを複数回通過するため、非常に非効率的です。<
  3. バッファの問題を回避し、telnet サーバーからメッセージを読み取り、データを表示してからバッファをダンプするために、JS クライアント コードに他に何かありますか? ソケットが開いたらすべてのメッセージを確実に取得する必要があるため、メッセージが失われるため、開いたり、閉じたり、再度開いたりすることはできません。

ありがとう、

ティム

4

2 に答える 2

2

実際、WebSocket には HTTP のようなハンドシェイクがあり、メッセージごとにフレーミングがあります (ハンドシェイク後の raw ソケットではありません)。

ただし、websockifyを使用して、WebSocket クライアント (ブラウザー) とプレーンな TCP ソケットの間をブリッジすることができます。Websockify を使用すると、WebSocket プロトコル (Hixie など) またはブラウザーがバイナリ型 (型付き配列など) を直接サポートしていない場合でも、TCP サーバーとの間でバイナリ データを送受信できます。

noVNCは websockify を使用して、WebSocket サポートがまだ組み込まれていない VNC サーバーに直接接続できるようにします。Websockify には、単純なブラウザーベースのターミナル エミュレーターを telnetd サーバーに接続する方法を示す小さなテストも含まれています。免責事項: websockify と noVNC を作成しました。

于 2012-04-04T21:38:49.403 に答える
1

プラグインのない純粋なHTML5が必要な場合は、WebSocketを使用するのが最善の解決策です。このようなテクノロジーでサポートされているブラウザを念頭に置いてください。サポートされているブラウザとプロトコルバージョンのリストはここにあります。

WebSocketは、接続が確立されたときにハンドシェイクを実行する必要があります。これは通常のhttp行です。その後、すべてのメッセージは、受信時と送信時にフレーミングする必要があります。ブラウザは自動的にそれを行いますが、デーモンにこの機能を実装する必要があります。

使用する言語に応じて、すぐに解決できるソリューションがあります。

自分でWebSocketプロトコルを実装したい場合は、たとえばJava実装のソースを確認し、公式仕様を使用してください:RFC6455

WebSocketが最善の方法だと思います。Java / Silverlight / Flashは他のソリューションかもしれませんが、より多くの労力が必要であり、WebSocketの実装のように簡単にスケーラブルではない可能性があります。これは、メッセージを処理し、受信したメッセージを含む別のDIVコンテナーにDIVのようなDOM要素を作成するだけです。

于 2012-04-05T09:04:18.903 に答える