4

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

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

Delphi 客户端没有这样的运气。到目前为止,我已经尝试了两个组件库(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 上的第一篇文章;抱歉,如果它有点长。

4

4 回答 4

4

我使用(或尝试/调查)这个 websocket 实现: http ://code.google.com/p/bauglir-websocket/

我不知道 ColdFusion,“通道”部分也不是我所知道的 websockets。CF 有网页客户端吗?然后你就可以在谷歌浏览器中轻松调试了

于 2012-06-22T07:38:12.920 回答
4

这不是真正的答案,而是故障排除建议。披露:我来自 CF 背景,但还没有看过 websocket 实现,所以这只是一般建议,以及我将如何解决这个问题。

可能值得在 CF 创建的客户端上查看客户端和服务器之间的 HTTP 和 WS 流量,以了解通道名称适合的位置。我搜索了网络套接字规范,我也找不到任何似乎等同于“通道”的东西。

根据我对 websocket 规范的阅读,据我所知,一个 URI = 一个“通道”:一个 URI 上没有多个通道(或“馈送”)的范围。从 CF 的角度来看——这完全是推测——这个“通道”概念是 CF 的一个技巧,能够在单个 URI 上跟踪多个 websocket 服务?CF 向后弯腰(有时会翻倒),试图让 CF 开发人员的生活“更轻松”,所以我可以看到他们这样做。或者只是他们只是决定以自己的方式实现,而不是认为客户端可能也不会使用 CF 的库来实现。

除了编辑材料:检查客户端和服务器之间传输的 HTTP 和 WS 数据包中发生了什么,我想你将能够弄清楚 WTH CF 正在做什么。

于 2012-06-25T07:57:06.887 回答
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"}

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

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

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

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

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

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

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

于 2012-06-29T05:09:34.693 回答
2

我试过这个在线演示: http ://www.raymondcamden.com/demos/2012/feb/19/chat/#

当我在“函数 msgHandler”(谷歌浏览器、检查元素、脚本选项卡)中放置断点时,我得到以下数据:

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 回答