HTML5 WebSocket 不工作。服务器=ColdFusion,客户端=Delphi

Set*_*uth 5 delphi coldfusion delphi-2009 websocket coldfusion-10

我正在编写一个消息分发系统。服务器是 ColdFusion (CF) 10,使用新的 <cfwebsocket> 功能集。客户端将用Delphi 2009编写。

如果我在 ColdFusion 中编写客户端(使用 <cfwebsocket> 标签),一切都会正常:我可以在两个客户端之间发送消息。所以服务器端似乎正在工作。

德尔福客户就没有这样的运气了。到目前为止,我已经尝试了两个组件库(Delphi on RailssgcWebSockets)。两者似乎都建立了与 CF 服务器的连接,但未发送或接收消息。我相当确定 Delphi 正在建立与服务器的连接,因为如果我指定正确的地址,则不会引发异常,而如果我指定不同的端口或 URI,则会出现异常。

我认为缺失的环节在于我对“渠道”的理解。在 CF 中这很简单:您指定要订阅或发送消息的频道,然后就可以了。但“通道”的概念在 ColdFusion 之外似乎并不存在。我搜索过 w3.org、Google 等,但在 HTML5 WebSocket 规范中没有看到太多有关通道的内容。一些参考资料,但没有明确的内容,特别是在示例中。

总之,我的问题:

  1. “通道”是标准 WebSocket API 的一部分吗?如果是,
  2. 如何使用我提到的 Delphi WebSocket 库之一订阅频道?难道不应该像 ws://[server]:[port]/[channel] 一样简单吗?
  3. 如何调试CF服务器上的WebSocket连接和流量?

非常感谢。这是我在 StackOverflow 上的第一篇文章;抱歉,如果有点长。

Set*_*uth 3

感谢您的提示!自从我发布问题以来,我做了一些调试并发现了一些答案。

“通道”是标准 WebSocket API 的一部分吗?

据我所知,没有。通道似乎是 ColdFusion 特有的概念。

如何使用我提到的 Delphi WebSocket 库之一订阅频道?难道不应该像 ws://[server]:[port]/[channel] 一样简单吗?

正如我原来的问题中提到的,Delphi(使用 TsgcWebSocketClient 组件)成功连接到 ColdFusion (CF) WebSocket 服务器。然而,我发现我省略了一个步骤:订阅CF“频道”。我通过使用 Microsoft Network Monitor 将 Delphi 客户端流量与 CF 客户端流量进行比较发现了这一点。CF 客户端在连接后向服务器发送附加字符串:

{"ns":"coldfusion.websocket.channels","type":"welcome","authKey":"6DD10C406710970271EDA2295C409D38","subscribeTo":"signals","appName":"Test"}
Run Code Online (Sandbox Code Playgroud)

这会将客户端订阅到“信号”通道。因此,在建立连接后,我将以下行添加到我的 Delphi 代码中:

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

Delphi 客户端立即能够从 CF“信号”通道接收消息。

仅供参考,以下是如何从 Delphi 客户端向“信号”通道发送消息(本例中为“Hello,World!”):

sgcWebSocketClient.WriteData( {"ns":"Delphi","type":"publish","channel":"signals","data":"Hello, World!","appName":"Test"}
Run Code Online (Sandbox Code Playgroud)

如何调试CF服务器上的WebSocket连接和流量?

我发现应用端口过滤器的 Microsoft 网络监视器是最简单的方法。它目前不支持环回/本地主机监控,因此我使用 LAN 上的另一台计算机来生成流量。