2013-03-02 58 views
1

好吧,这让我非常生气。我已经在整个互联网上关注了将近8篇教程,最终,我的Red5服务器实例正常运行。对我好!但是,当我打电话给我的Red5应用我的Java方法从我的AS3的应用程序,在Eclipse中的“控制台”窗口中,我得到这个错误:无法通过AS3在red5服务器上调用方法Flash CS6

[ERROR] [NioProcessor-1] org.red5.server.service.ServiceInvoker - Method getTheName with parameters [] not found in [email protected] 

这是我的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 ([email protected]) 
*/ 
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()); } 

它已经一个星期了,我一直试图弄清楚,我的日期是下个月。如果这些东西没有解决,我会失败的。请帮我解决我的问题。非常感谢你。

+0

不确定,但为什么你使用AMF0作为对象编码。Red5还支持AMF3,这是您在使用ActionScript 3时应该更喜欢的编码。AMF0对象编码更为过时,应该仅用于ActionScript 1.0和2.0中较旧的东西 – 2013-03-04 23:02:48

回答

0

对不起,我没有看到这2个月前,我本可以帮你通过你的评估。尽管如此,我想我可以回答这个问题,因为有类似的问题调用Red5服务。

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

你需要做的是在该文件中为你的方法添加一个bean条目。在你的情况下,该条目应该是这样的:

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

注意我用你的函数的名称,以“服务”追加。我不明白为什么,但你需要附加“.service”以便Red5找到你的功能。您需要为每个想要用作服务的功能类添加类似的条目。

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

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

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

,那么你将以下条目添加到您的RED5-web.xml文件:

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

这应该使一切工作。

我希望这可以帮助您在未来或任何其他人有这个问题。我只希望我早点见过这个问题。