HTML5 WebSockets 不工作。服务器=ColdFusion,客户端=Delphi
Posted
技术标签:
【中文标题】HTML5 WebSockets 不工作。服务器=ColdFusion,客户端=Delphi【英文标题】:HTML5 WebSockets not working. Server=ColdFusion, Client=Delphi 【发布时间】:2012-06-22 06:39:46 【问题描述】:我正在编写一个消息分发系统。服务器是 ColdFusion (CF) 10,使用新的
如果我在 ColdFusion 中编写客户端(使用
Delphi 客户端没有这样的运气。到目前为止,我已经尝试了两个组件库(Delphi on Rails 和sgcWebSockets)。两者似乎都建立了与 CF 服务器的连接,但没有发送或接收消息。我相当肯定 Delphi 正在建立与服务器的连接,因为如果我指定正确的地址,则不会引发异常,而如果我指定不同的端口或 URI,则会出现异常。
我认为缺失的环节在于我对“渠道”的理解。在 CF 中这很容易:您指定要订阅或发送消息的频道并且它可以工作。但是“渠道”的概念似乎在 ColdFusion 之外并不存在。我搜索了 w3.org、Google 等,但在 html5 WebSocket 规范中没有看到太多关于频道的信息。一些参考资料,但不清楚,尤其是在示例中。
总结一下,我的问题:
-
是标准 WebSocket API 的“通道”部分,如果是,
如何使用我提到的 Delphi WebSocket 库之一订阅频道?不应该像ws://[server]:[port]/[channel]这么简单吗?
如何在 CF 服务器上调试 WebSocket 连接和流量?
非常感谢。这是我在 *** 上的第一篇文章;如果有点长,请见谅。
【问题讨论】:
【参考方案1】:我使用(或尝试/调查)这个 websocket 实现: http://code.google.com/p/bauglir-websocket/
我不知道 ColdFusion,“通道”部分也不是我所知道的 websockets。 CF 有网页客户端吗?然后就可以在谷歌浏览器中轻松调试了
【讨论】:
【参考方案2】:这并不是真正的答案,而是故障排除建议。披露:我来自 CF 背景,但尚未查看 websocket 实现,所以这只是一般建议,以及我将如何解决此问题。
在 CF 创建的客户端上查看客户端和服务器之间的 HTTP 和 WS 流量可能是值得的,以了解通道名称适合的位置。我搜索了网络套接字规范,我也找不到任何似乎等同于“通道”的东西。
根据我对 websocket 规范的阅读,据我所知,一个 URI = 一个“通道”:一个 URI 上没有多个通道(或可能是“馈送”)的范围。从 CF 的角度来看——这完全是推测——这个“通道”概念是 CF 的一个技巧,能够在单个 URI 上跟踪多个 websocket 服务? CF 向后弯腰(有时会翻倒),试图让 CF 开发人员的生活“更轻松”,所以我可以看到他们这样做。或者只是他们只是决定以自己的方式实现,而不是认为客户端也可能不会使用 CF 的库来实现。
除了编辑材料:检查客户端和服务器之间传输的 HTTP 和 WS 数据包中发生了什么,我想您将能够弄清楚 WTH 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“信号”通道接收消息。
仅供参考,以下是如何从 Delphi 客户端向“信号”通道发送消息(在本例中为“Hello, World!”):
sgcWebSocketClient.WriteData( "ns":"Delphi","type":"publish","channel":"signals","data":"Hello, World!","appName":"Test"
如何在 CF 服务器上调试 WebSocket 连接和流量?
我发现应用了端口过滤器的 Microsoft Network Monitor 是最简单的方法。它目前不支持环回/本地主机监控,所以我使用局域网上的另一台计算机来生成流量。
【讨论】:
最新的谷歌浏览器版本支持websocket调试,可以查看html/web客户端和服务器之间的数据:***.com/a/10525328/197220【参考方案4】:我试过这个在线演示: 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 对象(作为字符串)。
【讨论】:
以上是关于HTML5 WebSockets 不工作。服务器=ColdFusion,客户端=Delphi的主要内容,如果未能解决你的问题,请参考以下文章
HTML5 Websockets 可以直接连接 2 个客户端(浏览器)而不使用服务器吗? (P2P)[重复]
HTML5 Canvas 不画线。 WebSockets 共享画布板