【问题标题】:Using websocket channel in GraniteDS Gravity在 GraniteDS Gravity 中使用 websocket 通道
【发布时间】:2013-05-15 15:50:57
【问题描述】:

我将 GraniteDS Gravity 用于我的消息传递服务。我的应用程序在使用数据轮询时工作正常,但是当我尝试使用 websocket 通道而不是数据轮询时,消息无法到达客户端。我还尝试修改由 Eclipse GraniteDS 插件创建的示例 Gravity 聊天应用程序以使用 websocket 通道,但它也不起作用。

我使用的是 Tomcat 7.0.39

为了更容易重现这个案例,我列出了我对 Eclipse 的 GraniteDS 插件创建的聊天应用程序所做的更改。

在 web.xml 中

1) 修改后的servlet类:

老:org.granite.gravity.servlet3.GravityAsyncServlet

新:org.granite.gravity.tomcat.TomcatWebSocketServlet

2) 修改 servlet 映射的 url 模式

老:/gravityamf/*

新:/websocketamf/*

3) 添加 Flash 策略监听器:

<listener>
    <listener-class>org.granite.gravity.websocket.PolicyFileServerListener</listener-class>
</listener>

<context-param>
    <param-name>flashPolicyFileServer-allowDomains</param-name>
    <param-value>*:*</param-value>
</context-param>

在 services-config.xml 中

1) 更新频道定义

旧:

<channel-definition
    id="gravityamf"
    class="org.granite.gravity.channels.GravityChannel">
    <endpoint
        uri="http://{server.name}:{server.port}/{context.root}/gravityamf/amf"
        class="flex.messaging.endpoints.AMFEndpoint"/>
</channel-definition>

新:

<channel-definition 
    id="gravityamf"
    class="org.granite.gravity.channels.WebSocketChannel">
    <endpoint
        uri="http://{server.name}:{server.port}/{context.root}/websocketamf/amf"
        class="flex.messaging.endpoints.AMFEndpoint" />
</channel-definition>

我没有更改 flex 客户端。 当我启动应用程序时,Tomcat 会打印日志“重力成功启动”。但是生产者发送的消息没有到达消费者。

可能是什么问题?我在配置中遗漏了什么吗?

谢谢。

【问题讨论】:

    标签: apache-flex websocket messaging gravity graniteds


    【解决方案1】:

    经过 4 天的代码努力,我找到了问题的原因。 首先,我在客户端调试 producer.send() 消息时发现了错误消息。尝试连接套接字时抛出以下异常

    "cannot connect to Web Socket server at 
     http://localhost:8080/gravityTest/websocketamf/amf
    (IoError: Error #2031: Socket Error. URL: localhost)"
    

    但是抛出的异常没有达到最高级别,所以很长一段时间我都不知道这个异常。

    在谷歌上搜索异常后,我发现它是由闪存安全策略引起的。然后我调试了PolicyFileServerListener,发现绑定后策略服务器的localAddress是[/0:0:0:0:0:0:0:0:843],因为它使用的是InetSocketAddressIPv6。我猜这是 JDK 1.7 的默认行为。当我将JDK的版本更改为1.6时,localAddress变为[/0.0.0.0:843]。在此更改之后,我的应用程序成功访问了策略服务器,并且使用 websocket 进行消息传递工作正常。

    【讨论】:

      猜你喜欢
      • 2019-01-12
      • 2017-06-08
      • 2019-04-27
      • 1970-01-01
      • 2015-10-09
      • 1970-01-01
      • 1970-01-01
      • 2016-02-19
      • 1970-01-01
      相关资源
      最近更新 更多