HTML5 WebSockets无法工作。服务器=ColdFusion,客户端=Delphi。

5
我正在编写一款消息分发系统。服务器使用 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
我正在使用(或尝试/调查)这个websocket实现: http://code.google.com/p/bauglir-websocket/ 我不了解ColdFusion,而且“channels”部分也不是我所知道的websocket。 CF有一个Web客户端吗?那么您可以在Google Chrome中轻松调试它。

4
这并不是一个答案,而是一个故障排除建议。声明:我有CF背景,但还没有看过websocket实现,所以这只是一般性建议,以及我如何进行故障排除。 您可能值得查看在CF创建的客户端之间的HTTP和WS流量,以了解频道名称的位置。 我搜查了websocket规范,并且我也找不到任何相当于“频道”的东西。根据我对websocket规范的理解,据我所知,一个URI=一个“频道”:在URI上没有更多的频道(或者也许是“feed”)的范围。从CF的角度来看,也许 - 这完全是猜测 - 这个“频道”概念是CF用来跟踪在单个URI上的多个websocket服务的技巧?CF竭尽全力(有时候甚至过分努力)试图让CF开发人员的工作变得“更容易”,所以我可以看到他们这样做。或者仅仅是他们决定自己实现,没有想到客户端端点也可以使用CF的库。编辑材料:检查客户端和服务器之间传输的HTTP和WS数据包中发生了什么,我想您就能够弄清楚CF正在做什么。

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“signals”通道的消息。

顺带一提,以下是如何从Delphi客户端向“signals”通道发送消息(在本例中为“Hello, World!”):

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

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

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


1
最新的Google Chrome版本支持WebSocket调试,因此您可以检查HTML / Web客户端与服务器之间的数据:https://dev59.com/m2ox5IYBdhLWcg3wzng0#10525328 - André

2
我尝试了这个在线演示:http://www.raymondcamden.com/demos/2012/feb/19/chat/# 当我在"function 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对象(作为字符串),并使用上述属性中的一些。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接