【问题标题】:Cannot call method in red5 server from AS3 Flash CS6无法从 AS3 Flash CS6 调用 red5 服务器中的方法
【发布时间】:2013-03-02 12:56:57
【问题描述】:

好吧,这让我很生气。我已经在 Internet 上学习了近 8 个教程,最后,我的 Red5 服务器实例正常工作。对我好!但是当我从我的 AS3 应用程序中调用我的 Red5 应用程序中的 Java 方法时,在 Eclipse 的“控制台”窗口中,我收到了这个错误:

[ERROR] [NioProcessor-1] org.red5.server.service.ServiceInvoker - Method getTheName with parameters [] not found in org.red5.core.Application@17e5fde

这是我的 Application.java 文件。

package org.red5.core;

import org.red5.server.adapter.ApplicationAdapter;
import org.red5.server.api.IConnection;
import org.red5.server.api.IScope;
import org.red5.server.api.service.ServiceUtils;

/**
 * Sample application that uses the client manager.
 * 
 * @author The Red5 Project (red5@osflash.org)
 */
public class Application extends ApplicationAdapter {

    /** {@inheritDoc} */
    @Override
    public boolean connect(IConnection conn, IScope scope, Object[] params) {
        return true;
    }

    /** {@inheritDoc} */
    @Override
    public void disconnect(IConnection conn, IScope scope) {
        super.disconnect(conn, scope);
    }

    public String getTheName() { return "MyName!"; }
}

这是我的 AS3 代码。我只是把它放在时间轴上。

var nc:NetConnection = new NetConnection();
nc.connect("http://localhost/Mintium/RoomHere", "SomeUsernameHere");
nc.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus);
nc.objectEncoding = ObjectEncoding.AMF0;

function onNetStatus(e:NetStatusEvent):void
{
    switch (e.info.code)
    {
        case "NetConnection.Connect.Success" :
            trace("connected");
                              nc.call("getTheName", new Responder(getName_result, getName_error));  
            break;
    }
}

function getName_result(res:Object):void { append("Name : " + res.toString()); }
function getName_error(res:Object):void { append(res.toString()); }

我已经一个星期想弄清楚了,我的日期是下个月。如果这件事不解决,我的评估将失败。请帮我解决我的问题。非常感谢。

【问题讨论】:

  • 不确定,但为什么要使用 AMF0 作为对象编码。 Red5 还支持 AMF3,这是您在使用 ActionScript 3 时应该首选的编码。AMF0 对象编码更加过时,应该只用于 ActionScript 1.0 和 2.0 中的旧东西

标签: java actionscript-3 flash remoting red5


【解决方案1】:

抱歉,我在 2 个月前没有看到这个,我本可以帮助您通过评估的。不过,我想我可以回答这个问题,因为调用 Red5 服务时遇到过类似的问题。

解决这个问题的关键在于 Red5 的那些使用 Spring 框架的部分。在您的项目中,应该有一个名为 red5-web.xml 的文件位于服务器项目的 WEB-INF 文件夹中。该文件包含 Red5 的 Spring 组件使用的一些 Bean 依赖项。在我阅读的教程中,甚至在大多数(相当稀疏和分布式的)red5 编程文档中都没有提到这一点。

您需要做的是在该文件中为您的方法添加一个 bean 条目。在您的情况下,条目应如下所示:

<bean id="getTheName.service" class="org.red5.core.Application" />

请注意我使用了您的函数名称,并附加了“.service”。我不明白为什么,但是您需要附加“.service”才能让 Red5 找到您的功能。您需要为要用作服务的每个类添加一个类似的条目。

当然,我上面所说的一切都是基于您将服务放入 Application 类这一事实——这是我从未做过的事情。如果您阅读 red5-web.xml 文件,您会看到该类已经有一个条目,因为它已经通过 Spring 作为类注入,充当处理 Web 上的请求的“端点”。我不知道使用 Application 类作为端点和服务提供者是否是一个好主意(它违反了 OOP 中的“关注点分离”,可能会导致 Spring 出现问题)。

我通常做的是在 org.red5.core 包(或您可能想要的任何其他包)中添加一个单独的类来提供所需的服务,然后在 red5-web.xml 中添加一个条目,注入类及其方法。因此,对于您的项目,假设您在 org.red5.core 包中有一个名为 NameProvider 的类:

public class NameProvider
{
   public NameProvider() {}
   public String getTheName() { return("MyName!"); }
}

然后您将以下条目添加到您的 red5-web.xml 文件中:

<bean id="getTheName.service" class="org.red5.core.NameProvider" />

这应该使一切正常。

我希望这对您将来或遇到此问题的其他人有所帮助。我只是希望我早点看到这个问题。

【讨论】:

    猜你喜欢
    • 2014-03-03
    • 1970-01-01
    • 2015-12-03
    • 2012-12-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2014-03-13
    • 1970-01-01
    相关资源
    最近更新 更多