flex和red5之间的rso。我可以创造,但不能阅读

时间:2011-10-01 13:28:20

标签: flex red5 shared-objects

所以我仍然坚持这一点,我可以创建远程共享对象,但我不能读取通知我有关更改。即时通讯使用red5的trunk版本,以及使用flash builder的flex 4.0。在调试中,我可以看到changeLog具有rso更改值的名称,但是对象本身具有未定义的值。

目前我在本地Windows机器上工作,但在ubuntu服务器10.04上尝试了一切,并得到了相同的结果。我可以连接到房间,创建共享对象,并通知所有客户端,但只有更改rso值的用户才能读取一次的值,其他只是获取未定义的值。 有没有人有这个问题的经验?我真的很感激任何帮助,因为这只是让我疯狂,我大约三个星期,阅读所有关于rso的教程,不能得到任何解决方案。我尝试使用持久性和非持久性,由服务器和客户端发起,但始终获得相同的结果。

客户端有我的代码:

protected function application1_creationCompleteHandler(event:FlexEvent):void {
                var room_id:Number = vars("room");
                connection = new NetConnection();
                connection.connect("rtmp://127.0.0.1/video/" + room_id);
                connection.addEventListener(NetStatusEvent.NET_STATUS, onConnected);
                connection.client = this;
            }

private function onConnected(event:NetStatusEvent) : void {
                if(event.info.code == "NetConnection.Connect.Success") {

                    so = SharedObject.getRemote("video", connection.uri, true);
                    so.addEventListener(SyncEvent.SYNC, onSync);
                    so.connect(connection);


                } else {
                    Alert.show("Unsuccessful Connection", "Information");
                }
private function onSync(event:SyncEvent):void {
          if(so.data["video"] != undefined)
             Alert.show(so.data["video"].toString(), "Information");
            }

在服务器端我有:

ISharedObject so;
    IServiceCapableConnection iconn;
    public static IScope iroom;

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

        iconn = (IServiceCapableConnection)conn;

        if (!super.connect(conn, scope, params)) {
            return false;
        }

        System.out.println("Connected True");

        return true;
    }

    /** {@inheritDoc} */
    @Override
    public void disconnect(IConnection conn, IScope scope) {
        super.disconnect(conn, scope);
    }
 @Override
    public boolean roomStart(IScope room) {
        if (!super.roomStart(room))
            return false;
        createSharedObject(room, "video", true);
        so = getSharedObject(room, "video");
        System.out.println("Room created succesfully");
        ISharedObjectListener listener = new SOEventListener();
        so.addSharedObjectListener(listener);

        return true;
    }

在客户端使用监听器我无法在控制台中输出并看到rso已更改且当前值是什么,虽然即时检查red5服务器上的持久性rso文件并且看起来一切正常并且唯一的事情是什么缺少的是为所有客户读取价值的机会。 我将不胜感激任何帮助。感谢

1 个答案:

答案 0 :(得分:0)

大问题出现的不是那么大。问题在于编码,默认情况下是AMF3,因为AS3和我需要做的只是,只需将编码更改为AMF0。

connection = new NetConnection();
connection.objectEncoding = ObjectEncoding.AMF0;
connection.connect("rtmp://127.0.0.1/video/" + room_id);

希望这对任何人都有帮助,因为网上有很多关于这些事情的信息。