HTML5 WebSocket不工作。服务器=ColdFusion,客户端=Delphi
我正在编写一个消息分发系统。服务器是ColdFusion(CF)10,使用新的功能集。客户端将在Delphi2009中编写 如果我用ColdFusion(使用标记)编写客户机,那么一切正常:我可以在两个客户机之间发送消息。因此,服务器端似乎正在工作 德尔福客户没有这样的运气。到目前为止,我已经尝试了两个组件库(和)。两者似乎都建立了与CF服务器的连接,但不会发送或接收消息。我相当确定Delphi正在连接到服务器,因为如果我指定了正确的地址,则不会引发异常,而如果我指定了不同的端口或URI,则会出现异常 我认为缺失的一环是我对“渠道”的理解。在CF中很容易:您可以指定订阅或发送消息的频道,然后它就可以工作了。但是“通道”的概念似乎并不存在于ColdFusion之外。我搜索了w3.org、谷歌等,在HTML5WebSocket规范中没有看到太多关于频道的内容。一些参考资料,但不清楚,尤其是在示例中 总之,我的问题是:HTML5 WebSocket不工作。服务器=ColdFusion,客户端=Delphi,delphi,coldfusion,websocket,delphi-2009,coldfusion-10,Delphi,Coldfusion,Websocket,Delphi 2009,Coldfusion 10,我正在编写一个消息分发系统。服务器是ColdFusion(CF)10,使用新的功能集。客户端将在Delphi2009中编写 如果我用ColdFusion(使用标记)编写客户机,那么一切正常:我可以在两个客户机之间发送消息。因此,服务器端似乎正在工作 德尔福客户没有这样的运气。到目前为止,我已经尝试了两个组件库(和)。两者似乎都建立了与CF服务器的连接,但不会发送或接收消息。我相当确定Delphi正在连接到服务器,因为如果我指定了正确的地址,则不会引发异常,而如果我指定了不同的端口或URI,则会出
CF有web客户端吗?然后你可以在Google Chrome中轻松地调试它。这不是一个真正的答案,而是一个故障排除建议。披露:我有CF背景,但还没有研究websocket的实现,所以这只是一般性的建议,以及我将如何对此进行故障排除 在CF创建的客户机上,查看客户机和服务器之间的HTTP&WS通信量可能是值得的,以查看通道名称在何处适用。我浏览了web套接字规范,也没有发现任何与“通道”等同的东西 从我对websocket规范的阅读来看,据我所知,一个URI=一个“通道”:在一个URI上没有多个通道(或者“提要”)的作用域。从CF的角度来看——这完全是推测——这个“通道”概念是CF的一个技巧,它能够在一个URI上跟踪多个websocket服务?为了让CF开发人员的生活“更轻松”,CF向后弯曲(有时甚至翻滚),所以我可以看到他们这样做。或者他们只是决定以自己的方式实现,而不认为客户端可能也不能用CF的库实现 旁白:检查客户端和服务器之间的HTTP&WS数据包中发生了什么,我想您将能够了解CF正在做什么。我尝试了这个在线演示: 当我在“函数msgHandler”(Google Chrome、inspect元素、脚本选项卡)中放置断点时,我得到以下数据:
Object
channel: "chat"
clientid: 692538231
code: 0
msg: "ok"
ns: "coldfusion.websocket.channels"
reqType: "getSubscriberCount"
subscriberCount: 1
type: "response"
__proto__: Object
但是,当我尝试另一个演示时:
它提供了以下数据:
Object
channelname: "whiteboard"
data: Object
ns: "coldfusion.websocket.channels"
publisherid: 692539350
type: "data"
__proto__: Object
至少我在里面看到了一些“频道”的东西。
因此,您可能应该使用上面的一些属性创建自己的JSON对象(作为字符串)。谢谢您的提示!我已经做了一些调试,因为我张贴了问题,并发现了一些答案 频道是标准WebSocket API的一部分吗? 据我所知,没有。频道似乎是一个ColdFusion特定的概念 如何使用我提到的Delphi WebSocket库之一订阅频道?它不应该像ws://[server]:[port]/[channel]那样简单吗? 正如我在原始问题中提到的,Delphi(使用TsgcWebSocketClient组件)成功地连接到ColdFusion(CF)WebSocket服务器。然而,我发现我忽略了一个步骤:订阅CF“频道”。我发现这一点是通过使用MicrosoftNetworkMonitor比较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!”):
如何调试CF服务器上的WebSocket连接和流量?
我发现应用了端口过滤器的Microsoft网络监视器是最简单的方法。它目前不支持环回/localhost监控,因此我使用局域网上的另一台计算机生成流量。最新的Google Chrome版本支持websocket调试,因此您可以检查html/web客户端和服务器之间的数据:
sgcWebSocketClient.WriteData( {"ns":"Delphi","type":"publish","channel":"signals","data":"Hello, World!","appName":"Test"}