подключение к удаленному общему объекту red5 из гибкого приложения

Пишу приложение Flex.

Серверное приложение - это Java-приложение поверх Red5 1.0. это соединение осуществляется через протокол RTMPE. (результаты такие же, как с RTMP или RTMPE).

Я могу правильно подключиться к серверу, входить в комнаты и выходить из них, но я не могу подключиться к общему объекту в комнате. с использованием непостоянного общего объекта.

Я создаю общий объект в комнате на стороне сервера, используя следующий код:

private void createSharedObject (IScope scope, String soName, boolean persistent) {
    ISharedObjectService service= (ISharedObjectService) ScopeUtils
            .getScopeService(scope,
                    ISharedObjectService.class,
                    false);
    service.createSharedObject(scope, soName, persistent);
}

private ISharedObject getSharedObject(IScope scope, String soName,boolean persistent) {
    ISharedObjectService service = (ISharedObjectService) ScopeUtils
            .getScopeService(scope,
                    ISharedObjectService.class,
                    false);
    return service.getSharedObject(scope, soName,persistent);
}

   public ISharedObject getRoomSharedObject() {
        final String soName = "room_" + this._scope.getName();

            log.debug("application found. creating shared object");
                log.debug("shared object: {} not found for scope: {}. creating one",new Object[]{soName,this._scope.getContextPath()});
            createSharedObject(this._scope, soName, XpoConstants.persistentSharedObjects);
            ISharedObject so = getSharedObject(this._scope,soName, XpoConstants.persistentSharedObjects);
            so.clear();

            return so;

    }      

затем пользователь входит в нужную комнату, я получаю соединение, вызываю функцию на его конце и предоставляю имя общего объекта, чтобы он знал, к чему подключиться, используя следующий код:

    IConnection conn = Red5.getConnectionLocal();
    IServiceCapableConnection sc = (IServiceCapableConnection) conn;
    sc.invoke("<function name>", new Object[]{this._so.getName(),...});

Теперь на стороне клиента я использую следующий код в гибком приложении для получения удаленного общего объекта:

var roomSharedObject:SharedObject = SharedObject.getRemote(soName,   SharedUtils.getNetConnection().uri, Finals.persistentSharedObject);

roomSharedObject.addEventListener(NetStatusEvent.NET_STATUS, this._parse);

roomSharedObject.addEventListener(SyncEvent.SYNC,this._parse2);
roomSharedObject.connect(SharedUtils.getNetConnection());

...

    private function _parse(e:NetStatusEvent):void {
        trace("NETSTATUSEVENT");
        trace("########## EVENT INFO CODE: " + e.info.code);
    }

    private function _parse2(e:SyncEvent):void {
        trace("SYNCEVENT");

    }

единственное сообщение, которое я получаю от red5, следующее:

[INFO] [pool-8-thread-12] org.red5.server.so.SharedObject - Deleting shared object room_3963 because all clients disconnected and it is no longer acquired.

Я бы предположил, что запуск NetStatusEvent должен вызвать какое-то сообщение об ошибке, но я не получаю никаких сообщений о трассировке! и единственное, что я получаю от red5, это то, что общий объект удален, что означает, что этот клиент пытался подключиться в течение секунды и отключился.

Устал гуглить, надоел гугл группу red5. я потерялся! любая информация по этому вопросу будет принята с благодарностью.

Спасибо!

Обновить

хорошо, я создал меньшего по размеру клиента и сервера ..

на сервере функция appConnect просто возвращает true.

клиент - это клиент Flex 4.6 со следующим кодом:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" creationComplete="init()"
minHeight="600">
<fx:Declarations>
    <!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>

<fx:Script>
    <![CDATA[
    import mx.controls.Alert;

    private var nc:NetConnection = new NetConnection();

    private function init():void {

        nc.proxyType = "best";
        nc.objectEncoding = ObjectEncoding.AMF0;
        nc.addEventListener (NetStatusEvent.NET_STATUS,checkConnect);                    
        nc.connect("rtmpe://127.0.0.1/ufktest");

    }

    private function checkConnect (event:NetStatusEvent):void
    {
        switch (event.info['code']) {
            case 'NetConnection.Connect.Success':
            {   
                _red5Connected();
                trace('connected succesfully');
                break;
            }
            case 'NetConnection.Connect.Closed':
            {   
                _red5Disconnected();
                trace('connection closed');
                break;
            }
            case 'NetConnection.Connect.Rejected':
            {
                _red5Disconnected();
                trace('connection rejected' );
                break;
            }
            case 'NetConnection.Connect.Failed':
            {
                _red5Disconnected();
                trace('connection failed');
                break;
            }
            case 'NetConnection.Connect.AppShutDown':
            {
                trace('app shut down');
                _red5Disconnected();
                break;
            }
            default:
            {
                trace("unknown netconenction status: " + event.info['code']);                   
                break;
            }               
        }

    }

        private function _red5Connected():void {
            trace("red5 connection was successful");
            var roomSharedObject:SharedObject = SharedObject.getRemote("moshe",nc.uri,false);
            roomSharedObject.addEventListener(NetStatusEvent.NET_STATUS, _parse);
            roomSharedObject.addEventListener(SyncEvent.SYNC,_parse2);
            roomSharedObject.connect(nc);


        }
    private function _parse(e:NetStatusEvent):void {
        trace("NETSTATUSEVENT");
        trace("########## EVENT INFO CODE: " + e.info.code);
    }

    private function _parse2(e:SyncEvent):void {
        trace("SYNCEVENT");

    }

        private static function _red5Disconnected():void {
            trace("disconnected from red5");
            Alert.show("could not connect to server, please try again later");
        }


    ]]>
</fx:Script>

and still when I run the client application it connects to the server and give me the following error:

[INFO] [pool-8-thread-15] org.red5.server.so.SharedObject - Deleting shared object moshe because all clients disconnected and it is no longer acquired.

person ufk    schedule 24.12.2012    source источник


Ответы (2)


Еще журналы? Однако ваш журнал предполагает, что общий объект был успешно создан на сервере. Попробуйте использовать метод Acqua () для создания общего объекта внутри roomStart() или где бы вы его ни создавали (хотя roomStart() должно быть правильным местом). Сервер по умолчанию уничтожит любой общий объект, если клиент не подключен.

person deepankardixit90    schedule 16.01.2013

Это кажется слишком сложным способом сделать это. Если вы используете метод Flex SharedObject::getRemote, обо всем этом позаботятся вы. Если объект существует, клиент получит копию. Если его не существует, объект будет создан. Итак, первый человек в «комнате» создает объект, и любой, кто появится позже, получит копию.

person ethrbunny    schedule 24.12.2012
comment
Общий объект создается при создании комнаты. Я обновляю общий объект данными, но по какой-то причине функция подключения гибкого приложения не возвращает никакого статуса или какой-либо ошибки, которая делает невозможным отладку. Кроме. Я хочу ввести некоторые данные в общий объект. Сначала я должен его создать. - person ufk; 24.12.2012
comment
Вы можете перехватить процесс создания на сервере и заполнить его своими исходными данными. Я думаю, что комнаты не существует, пока в нее не войдет клиент. - person ethrbunny; 24.12.2012
comment
Ага. Я захватываю начало комнаты и создаю общий объект, когда это происходит. Думаю, проблема не на стороне сервера, а на стороне клиента. почему функция подключения вообще не возвращает никакого статуса? - person ufk; 25.12.2012
comment
Можете ли вы задержать создание общего объекта? Тогда предварительно заполните его? - person ethrbunny; 25.12.2012
comment
Я использую живую систему подсчета очков в этом общем объекте в каждой комнате для каждой игры для каждого игрока. как это сделать? не могли бы вы предоставить образец кода? - person ufk; 25.12.2012
comment
Я попробую то, что вы предложили. - person ufk; 25.12.2012
comment
точно такие же результаты. что-то не так на стороне клиента. Любые идеи? возможно, проблемы, связанные с доменом безопасности, которые позволяют мне подключаться, но по какой-то причине не создавать удаленный объект? я потерялся! - person ufk; 25.12.2012
comment
Как только клиент подключен, сможет ли он увидеть объект (ы) комнаты? - person ethrbunny; 25.12.2012
comment
в комнате нет никаких предметов. только общий объект, в который я изначально хотел ввести данные, теперь я удалил. и теперь, когда клиент пытается получить общий объект, он мгновенно отключается от него, но все еще остается подключенным к red5. - person ufk; 25.12.2012
comment
пожалуйста, дайте мне конкретно, какие тесты вы хотите, чтобы я провел, и я их проведу. пожалуйста, предоставьте как можно больше информации, чтобы для нашей итерации было больше информации ... пожалуйста :) например ... что вы имеете в виду под объектами комнаты, общим объектом, который я создал раньше ?! - person ufk; 25.12.2012