Показать сообщение отдельно
Старый 10.04.2013, 01:56
bvfromul вне форума Посмотреть профиль Отправить личное сообщение для bvfromul Найти все сообщения от bvfromul
  № 1  
Ответить с цитированием
bvfromul

Регистрация: Apr 2013
Сообщений: 1
По умолчанию как заставить работать обработчик сообщения отсылаемый в NetStream.send()

Добрый вечер! Изучаю класс NetStream и ни как не удается заставить работать обработчик сообщений, отсылаемый в NetStream.send().

Сразу прошу прощения за возможные ошибки в формулировках, т.к. недавно начал изучать as3 и flex.

Прикладываю код, к-ый поможет понять суть проблемы.

mxml приложения:
Код:
<?xml version="1.0" encoding="utf-8"?>

<main:VideoChatApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
                     xmlns:s="library://ns.adobe.com/flex/spark"
                     xmlns:mx="library://ns.adobe.com/flex/mx"
                     xmlns:main="main.*" minWidth="955" minHeight="600">
</main:VideoChatApplication>
класс для приложения:
Код:
package main
{
    import flash.events.Event;
    
    import mx.events.FlexEvent;
    
    import spark.components.Application;

    public class VideoChatApplication extends Application
    {
        private var applicationData:ApplicationData;
        private var netStreamManager:NetStreamManager;
        private var userInterface:UserInterface;
        private var userHttpManger:UserHttpManager;

        public function VideoChatApplication() 
        {
            addEventListener(FlexEvent.CREATION_COMPLETE, init);
        }

        private function init(event:FlexEvent):void
        {
            applicationData = new ApplicationData();
            netStreamManager = new NetStreamManager(applicationData._cirrusURL, applicationData._cirrusDeveloperKey);
            netStreamManager.addEventListener('PEERID_READY', pickupPeerId);

            createConnectionUi();
        }

        private function createConnectionUi():void
        {
            userInterface = new UserInterface(applicationData._hostList);
            userInterface.addEventListener('NICK_AND_HOST_READY', allDataReady);
            userInterface.addEventListener('TEXTAREA_MESSAGE_IS_READY', sendTextareaMessagetoUI);

            addElement(userInterface);
        }

        private function pickupPeerId(event:Event):void
        {
            applicationData._peerID = netStreamManager._peerId;
        }

        private function allDataReady(event:Event):void
        {
            applicationData._userNick = userInterface._userNick;
            applicationData._webServerUrl = userInterface._hostURL;

            userHttpManger = new UserHttpManager(applicationData._webServerUrl, applicationData._peerID, applicationData._userNick);
            userHttpManger.addEventListener('SUCCESS_CONNECT', connectionIsReady);
            userHttpManger.addEventListener('SUCCESS_GET_PEERS', peersIsReady);
            userHttpManger.addEventListener('USERSHTTP_ERROR', userHttpError);
        }

        private function userHttpError(event:Event):void
        {
            userInterface.showError(userHttpManger._errorString);
        }

        private function connectionIsReady(event:Event):void
        {
            applicationData.saveHost(userInterface._currentHostsList);
        }

        private function peersIsReady(event:Event):void
        {
            var isNewConnecion:Boolean = !(applicationData._peerList.length as Boolean);
            applicationData._peerList = userHttpManger._peersList;
            if (isNewConnecion)
            {
                showVideoAndChatUi(applicationData._peerList.length);
            }
            netStreamManager.initStreams(applicationData._peerList, isNewConnecion);
        }

        private function showVideoAndChatUi(peersCount:int):void
        {
            userInterface.showVideoAndChatUi(peersCount);
        }
        
        private function sendTextareaMessagetoUI(event:Event):void
        {
            userInterface.addChatMessage(netStreamManager._textareaMessage);
        }
        

        public function receiveSomeData(message:String):void
        {
            trace('recive '+ message);
        }
    }
}
код класса в котором есть NetStream.send():
Код:
package main
{
    import flash.events.Event;
    import flash.events.EventDispatcher;
    import flash.events.NetStatusEvent;
    import flash.net.NetConnection;
    import flash.net.NetStream;

    public class NetStreamManager extends EventDispatcher
    {
        private var textareaMessage:String;
        private var peerId:String;
        private var netConnection:NetConnection;
        private var sendStream:NetStream;
        private var recvStreams:Object = {};

        public function NetStreamManager(cirrusUrl:String, developerKey:String)
        {
            initNetConnection(cirrusUrl, developerKey);
        }

        private function initNetConnection(cirrusUrl:String, developerKey:String):void
        {
            netConnection = new NetConnection();
            netConnection.addEventListener(NetStatusEvent.NET_STATUS,netConnectionStatus);
            netConnection.connect(cirrusUrl + developerKey);
        }

        private function netConnectionStatus(event:NetStatusEvent):void
        {
            peerId = netConnection.nearID;
            dispatchEvent(new Event('PEERID_READY'));
        }

        public function get _peerId():String
        {
            return peerId;
        }

        public function initStreams(strangerPeers:Array, isNewConnecion:Boolean):void
        {
            if (isNewConnecion)
            {
                initSendStream();
            }
            initRecvStreams(strangerPeers);
        }

        private function initSendStream():void
        {
            sendStream = new NetStream(netConnection, NetStream.DIRECT_CONNECTIONS);
            sendStream.publish("media");

            var sendStreamClient:Object = {};

            sendStreamClient.onPeerConnect = function(callerns:NetStream):Boolean{
                var farPeerID:String = callerns.farID;
                
                trace("onPeerConnect "+farPeerID);
                return true;
            }

            sendStream.client = sendStreamClient;
        }

        private function initRecvStreams(strangerPeers:Array):void
        {
            var key:String;

            for (key in strangerPeers)
            {
                if (recvStreams[strangerPeers[key].id])
                {
                    recvStreams[strangerPeers[key].id].isUpdate = 1;
                }
                else
                {
                    var recvStream:NetStream = new NetStream(netConnection, strangerPeers[key].id);
                    recvStream.play("media");
                    recvStream.client = this;
                    recvStreams[strangerPeers[key].id] = {}
                    recvStreams[strangerPeers[key].id].recvStream = recvStream;
                    recvStreams[strangerPeers[key].id].nick = strangerPeers[key].nick;
                    recvStreams[strangerPeers[key].id].isConnected = 0;
                    recvStreams[strangerPeers[key].id].isUpdate = 1;
                }
            }
            deleteOldStreams();
            sendSomeData('/ping ' + peerId);
        }

        private function deleteOldStreams():void
        {
            var key:String;

            for (key in recvStreams)
            {
                if (recvStreams[key].isUpdate == 0)
                {
                    recvStreams.splice(recvStreams.indexOf(recvStreams[key]),1);
                }
                else
                {
                    recvStreams[key].isUpdate == 0;
                }
            }
        }

        public function receiveSomeData(message:String):void
        {
            trace('recive '+ message);
            textareaMessage = '';

            switch (message.substring(0, 5))
            {
                case '/ping':
                    var peer:String = message.substr(5, message.length);
                    if (recvStreams[peer])
                    {
                        recvStreams[peer].isConnected = 1;
                        textareaMessage = recvStreams[peer].nick + ' connected';
                    }
                break;
            }

            if (textareaMessage.length)
            {
                dispatchEvent(new Event('TEXTAREA_MESSAGE_IS_READY'));
            }
        }

        public function sendSomeData(message:String):void
        {
            trace('send '+ message);
            sendStream.send("receiveSomeData", message);
        }
        
        public function get _textareaMessage():String
        {
            return textareaMessage;
        }
    }
}

Соединение успешно устанавливается, о чем сигнализирует trace в NetStreamManager.initSendStream(), но не удается обменяться сообщениями. Функция receiveSomeData, почему-то не находятся ни в классе NetStreamManager, ни в классе
VideoChatApplication. Даже пытался создавать отдельный класс для recvStream.client, тоже не помогло:

Код:
recvStream.client = new test();

package main
{
    public class test
    {
        public function receiveSomeData(message:String):void
        {
            trace('recive '+ message);
        }
    }
}
Подскажите, пожалуйста, в чем проблема? Как заставить работать обработчик получения сообщения, отправленное при помощи NetStream.send()?

Добавлено через 71 час 48 минут
Нашел в чем проблема, оказывается я каждый раз заново инициализировал исходящий поток.