4

メッセージ配信システムをコーディングしています。サーバーは、新しい <cfwebsocket> 機能セットを使用する ColdFusion (CF) 10 です。クライアントは Delphi 2009 で作成されます。

(<cfwebsocket> タグを使用して) ColdFusion でクライアントを作成すると、問題なく動作します。2 つのクライアント間でメッセージを送信できます。したがって、サーバー側は機能しているようです。

Delphi クライアントでは、そのような運はありません。これまでに 2 つのコンポーネント ライブラリを試しました ( Delphi on RailssgcWebSockets )。どちらも CF サーバーへの接続を確立しているように見えますが、メッセージは送受信されません。正しいアドレスを指定した場合は例外がスローされず、別のポートまたは URI を指定した場合は例外が発生するため、Delphi がサーバーに接続していることはほぼ確実です。

ミッシングリンクは、「チャネル」の理解にあると思います。CF では簡単です。サブスクライブするか、メッセージを送信するチャネルを指定すると、それが機能します。しかし、「チャネル」の概念は、ColdFusion 以外にはあまり存在しないようです。w3.org、Google などを検索しましたが、HTML5 WebSocket 仕様のチャネルについてはあまりわかりません。いくつかの参考文献がありますが、特に例では明確なものはありません。

要約すると、私の質問:

  1. 「チャネル」は標準の WebSocket API の一部であり、そうであれば、
  2. 前述の Delphi WebSocket ライブラリの 1 つを使用してチャネルをサブスクライブするにはどうすればよいですか? ws://[server]:[port]/[channel] と同じくらい簡単ではないでしょうか?
  3. CF サーバーで WebSocket 接続とトラフィックをデバッグする方法は?

どうもありがとう。これは、StackOverflow に関する私の最初の投稿です。少し長い場合は申し訳ありません。

4

4 に答える 4

4

私はこのWebSocket実装を使用(または試行/調査)しています: http ://code.google.com/p/bauglir-websocket/

私はColdFusionを知りません。また、「チャネル」の部分は私がWebSocketについて知っているものではありません。CFはWebクライアントですか?その後、GoogleChromeで簡単にデバッグできます

于 2012-06-22T07:38:12.920 に答える
4

これは本当の答えではありませんが、トラブルシューティングの提案です。開示: 私は CF のバックグラウンドを持っていますが、websocket の実装をまだ見ていないため、これは単なる一般的なアドバイスであり、これをトラブルシューティングする方法です。

CF で作成されたクライアント上のクライアントとサーバー間の HTTP および WS トラフィックを調べて、チャネル名がどこに当てはまるかを確認する価値があるかもしれません。Web ソケットの仕様を精査しましたが、「チャネル」と同等と思われるものは何も見つかりませんでした。

websocket の仕様を読んだところ、私が知る限り、1 つの URI = 1 つの「チャネル」です。URI に複数のチャネル (またはおそらく「フィード」) の範囲はありません。CF の観点からは、これは完全な憶測ですが、この「チャネル」の概念は、単一の URI で複数の websocket サービスを追跡できるようにするための CF のトリックですか? CF は、CF 開発者の生活を「楽に」しようとするために後ろ向きに曲がっています (時々、ひっくり返るほどです)。または単に、クライアント エンドが CF のライブラリでも実装されない可能性があるとは考えずに、独自の方法で実装することを決定しただけです。

編集資料はさておき: クライアントとサーバーの間を行き来する HTTP および WS パケットで何が起こっているかを確認してください。

于 2012-06-25T07:57:06.887 に答える
3

ヒントをありがとう!質問を投稿してから少しデバッグを行い、いくつかの回答を見つけました。

「チャネル」は標準のWebSocketAPIの一部ですか?

私の知る限りではありません。チャネルはColdFusion固有の概念のようです。

前述のDelphiWebSocketライブラリの1つを使用してチャネルをサブスクライブするにはどうすればよいですか?ws:// [server]:[port] / [channel]のように簡単ではないでしょうか?

私の最初の質問で述べたように、Delphi(TsgcWebSocketClientコンポーネントを使用)はColdFusion(CF)WebSocketサーバーに正常に接続していました。ただし、CFの「チャネル」にサブスクライブするという手順を省略していることがわかりました。これは、Microsoft NetworkMonitorを使用してDelphiクライアントトラフィックをCFクライアントトラフィックと比較することで発見しました。CFクライアントは、接続後にサーバーに追加の文字列を送信していました。

{"ns":"coldfusion.websocket.channels","type":"welcome","authKey":"6DD10C406710970271EDA2295C409D38","subscribeTo":"signals","appName":"Test"}

これにより、クライアントは「シグナル」チャネルにサブスクライブされます。そこで、接続が確立された後、Delphiコードに次の行を追加しました。

sgcWebSocketClient.WriteData( '{"ns":"Delphi","type":"welcome","authKey":"6DD10C406710970271EDA2295C409D38","subscribeTo":"signals","appName":"Test"}' );

Delphiクライアントは、CFの「信号」チャネルからメッセージをすぐに受信できました。

参考までに、Delphiクライアントから「signals」チャネルにメッセージ(この場合は「Hello、World!」)を送信する方法は次のとおりです。

sgcWebSocketClient.WriteData( {"ns":"Delphi","type":"publish","channel":"signals","data":"Hello, World!","appName":"Test"}

CFサーバーでWebSocket接続とトラフィックをデバッグする方法は?

ポートフィルターを適用したMicrosoftNetworkMonitorが最も簡単な方法であることがわかりました。現在、ループバック/ローカルホストの監視をサポートしていないため、LAN上の別のコンピューターを使用してトラフィックを生成しました。

于 2012-06-29T05:09:34.693 に答える
2

このオンライン デモを試してみました: http://www.raymondcamden.com/demos/2012/feb/19/chat/#

「関数 msgHandler」(Google Chrome、要素の検査、スクリプト タブ) にブレークポイントを配置すると、次のデータが得られます。

Object
channel: "chat"
clientid: 692538231
code: 0
msg: "ok"
ns: "coldfusion.websocket.channels"
reqType: "getSubscriberCount"
subscriberCount: 1
type: "response"
__proto__: Object

ただし、別のデモを試すと、 http ://www.raymondcamden.com/demos/2012/feb/19/whiteboard/ で次のデータが得られます。

Object
channelname: "whiteboard"
data: Object
ns: "coldfusion.websocket.channels"
publisherid: 692539350
type: "data"
__proto__: Object

少なくとも、その中にいくつかの「チャネル」が表示されます。したがって、上記のプロパティのいくつかを使用して、独自の JSON オブジェクトを (文字列として) 作成する必要があります。

于 2012-06-25T13:56:58.987 に答える