Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
HTML5 WebSocket不工作。服务器=ColdFusion,客户端=Delphi_Delphi_Coldfusion_Websocket_Delphi 2009_Coldfusion 10 - Fatal编程技术网

HTML5 WebSocket不工作。服务器=ColdFusion,客户端=Delphi

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,则会出

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

如果我用ColdFusion(使用标记)编写客户机,那么一切正常:我可以在两个客户机之间发送消息。因此,服务器端似乎正在工作

德尔福客户没有这样的运气。到目前为止,我已经尝试了两个组件库(和)。两者似乎都建立了与CF服务器的连接,但不会发送或接收消息。我相当确定Delphi正在连接到服务器,因为如果我指定了正确的地址,则不会引发异常,而如果我指定了不同的端口或URI,则会出现异常

我认为缺失的一环是我对“渠道”的理解。在CF中很容易:您可以指定订阅或发送消息的频道,然后它就可以工作了。但是“通道”的概念似乎并不存在于ColdFusion之外。我搜索了w3.org、谷歌等,在HTML5WebSocket规范中没有看到太多关于频道的内容。一些参考资料,但不清楚,尤其是在示例中

总之,我的问题是:

  • “通道”是否是标准WebSocket API的一部分,如果是
  • 如何使用我提到的DelphiWebSocket库之一订阅频道?它不应该像ws://[server]:[port]/[channel]那样简单吗
  • 如何调试CF服务器上的WebSocket连接和流量
  • 非常感谢。这是我关于StackOverflow的第一篇文章;如果有点长,请道歉。

    我正在使用(或尝试/调查)此websocket实现:

    我不知道ColdFusion,而且“通道”部分也不是我所知道的WebSocket。
    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"}