我正在编写邮件分发系统。服务器是ColdFusion(CF)10,使用新的< cfwebsocket>功能集。客户将使用Delphi 2009编写。
如果我在ColdFusion中编写客户端(使用< cfwebsocket>标记),一切正常:我可以在两个客户端之间发送消息。所以服务器端似乎正在运行。
Delphi客户端没有这样的运气。到目前为止,我已经尝试了两个组件库(Delphi on Rails和sgcWebSockets)。两者似乎都建立了与CF服务器的连接,但不发送或接收消息。我相当确定Delphi正在建立与服务器的连接,因为如果指定了正确的地址则不会引发异常,而如果我指定了不同的端口或URI,则会出现异常。
我认为缺失的环节是我对“渠道”的理解。在CF中很简单:您指定要订阅或发送消息的频道并且它可以正常工作。但是,“渠道”的概念似乎并不存在于ColdFusion之外。我搜索过w3.org,谷歌等,并且在HTML5 WebSocket规范中没有看到太多关于频道的信息。一些参考文献,但没有任何明确的,特别是在例子中。
总之,我的问题:
非常感谢。这是我在StackOverflow上的第一篇文章;道歉,如果它有点长。
答案 0 :(得分:4)
我使用(或尝试/调查)此websocket实现: http://code.google.com/p/bauglir-websocket/
我不知道ColdFusion,“渠道”部分也不是我所知道的websockets。 CF有网络客户端吗?然后,您可以在Google Chrome中轻松调试
答案 1 :(得分:4)
这不是一个真正的答案,而是一个故障排除建议。披露:我来自CF背景,但尚未查看websocket实现,所以这只是一般性建议,以及我如何对此进行故障排除。
可能值得一看HTTP&在CF创建的客户端上的客户端和服务器之间的WS流量,以查看通道名称适合的内容。我搜索了网络套接字规范,我也找不到任何似乎等同于“频道”的内容。
从我对websocket规范的阅读中,据我所知,一个URI =一个“频道”:URI上没有多个频道(或者“馈送”)的范围。从CF的角度来看 - 这是完全的推测 - 这个“通道”概念是CF能够在单个URI上跟踪多个websocket服务的技巧吗? CF向后弯曲(有时翻滚到某些地方)试图让CF开发人员“更容易”生活,所以我可以看到他们这样做。或者只是他们只是决定实现自己的方式,而不是认为客户端也可能没有用CF的库实现。
除了编辑材料:检查HTTP&中发生了什么WS数据包在客户端和服务器之间传输,我想你将能够解决WTH CF正在做的事情。
答案 2 :(得分:3)
感谢您的提示!自从我发布问题并发现了一些答案后,我做了一些调试。
“渠道”是标准WebSocket API的一部分吗?
据我所知,不。频道似乎是特定于ColdFusion的概念。
如何使用我提到的某个Delphi WebSocket库订阅频道?它不应该像ws:// [服务器]:[端口] / [频道]一样容易吗?
正如我在原始问题中所提到的,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"}
如何调试WebSocket连接& CF服务器上的流量?
我发现使用端口过滤器的Microsoft网络监视器是最简单的方法。它目前不支持环回/本地主机监控,因此我在LAN上使用另一台计算机来生成流量。
答案 3 :(得分: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对象(作为字符串)。