【问题标题】:HTML5 WebSockets not working. Server=ColdFusion, Client=DelphiHTML5 WebSockets 不工作。服务器=ColdFusion,客户端=Delphi
【发布时间】:2012-06-22 06:39:46
【问题描述】:

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

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

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 上的第一篇文章;如果有点长,请见谅。

【问题讨论】:

    标签: delphi coldfusion websocket delphi-2009 coldfusion-10


    【解决方案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 是最简单的方法。它目前不支持环回/本地主机监控,所以我使用局域网上的另一台计算机来生成流量。

        【讨论】:

        【解决方案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 对象(作为字符串)。

        【讨论】:

          猜你喜欢
          • 2017-05-19
          • 1970-01-01
          • 2011-06-26
          • 1970-01-01
          • 2016-11-12
          • 2014-12-06
          • 2019-02-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多