Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 接收多个NetStream.Connect.Success事件,该事件本应为';不会发生_Actionscript 3_P2p_Netstream_Netconnection_Adobe Cirrus - Fatal编程技术网

Actionscript 3 接收多个NetStream.Connect.Success事件,该事件本应为';不会发生

Actionscript 3 接收多个NetStream.Connect.Success事件,该事件本应为';不会发生,actionscript-3,p2p,netstream,netconnection,adobe-cirrus,Actionscript 3,P2p,Netstream,Netconnection,Adobe Cirrus,我正在尝试使用NetStream在在线Flash多人游戏中在玩家之间传递数据 我使用NetConnection类发送的事件,以便了解客户端的当前状态 例如,当我有一个“NetConnection.Connect.Success”时,我知道我可以开始使用NetStream类并将NetConnection对象传递给它 一切都有意义,一切正常 但是,在收听NetStream.Connect.Success事件时,我遇到了一个问题。这个事件似乎是无缘无故地多次触发的,它是在两个用户相互连接时第一次触发的

我正在尝试使用NetStream在在线Flash多人游戏中在玩家之间传递数据

我使用NetConnection类发送的事件,以便了解客户端的当前状态

例如,当我有一个“NetConnection.Connect.Success”时,我知道我可以开始使用NetStream类并将NetConnection对象传递给它

一切都有意义,一切正常

但是,在收听NetStream.Connect.Success事件时,我遇到了一个问题。这个事件似乎是无缘无故地多次触发的,它是在两个用户相互连接时第一次触发的,这很好,我可以看到他们的farID并将其传递给另一个对等方,并且一切正常

但是,在这些对等点之间的第一次连接之后,又会无明显原因地触发3或4个NetStream.Connect.Success。这不仅让我恼火,因为我不明白为什么会发生这种情况,而且还打破了我的“基于事件”的体系结构,以确定下一步要做什么,即触发了什么事件

在收到NetStream.Connect.Closed之前,我可以毫无问题地发送和接收消息,这通常发生在几秒钟之后。有时我从来没有收到过关闭的事件,有时当我收到一个事件时,我仍然可以发送和接收消息,就像另一个连接关闭了,而不是我现在正在使用的连接

就像你看到的,这真的很混乱,我不知道我是犯了什么错误,还是整个活动系统设计得很糟糕

另一件我不知道我做得是否正确的事情是,我将发送流和接收流的客户机属性分配给“this”,不确定这是否正确,但因为它“有效”。。我想这不是这种奇怪行为的责任

(amfphp服务的作用是交换farID的)

这是我的代码,它是一个非常简单的聊天应用程序:

<?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" width="700" height="700"
               >
    <s:VGroup width="100%">
        <s:TextArea id="historyTxt" width="100%" verticalAlign="bottom" enabled="false"/>
        <s:TextInput id="inputTxt" enter="sendMessage(event)"/>
    </s:VGroup>

    <s:Button id="joinBtn" x="250" y="300" width="200" height="100" label="JOIN" fontSize="20" click="init()"/>

    <mx:Text id="nearIDTxT" x="10" y="647" text="nearID" alpha="0.7" fontStyle="italic"/>
    <mx:Text id="farIDTxT" x="10" y="669" text="farID" alpha="0.5" fontStyle="italic"/>

    <fx:Script>
        <![CDATA[

            import flash.display.SimpleButton;
            import flash.display.Sprite;
            import flash.events.Event;
            import flash.events.EventDispatcher;
            import flash.events.NetStatusEvent;
            import flash.events.StatusEvent;
            import flash.geom.Point;
            import flash.net.GroupSpecifier;
            import flash.net.NetConnection;
            import flash.net.NetGroup;
            import flash.net.NetStream;
            import flash.net.registerClassAlias;
            import flash.utils.ByteArray;
            import flash.utils.Dictionary;
            import flash.utils.Timer;
            import flash.utils.getTimer;

            private const SERVER:String = "rtmfp://p2p.rtmfp.net/"; 
            private const DEVKEY:String = "cde41fe05bb01817e82e5398-2ab5d983d09f"; 
            private const NAME:String = "Paul";
            private static const BOT:int = 1;
            private static const TOP:int = 0;

            private var _groupSpecifier:GroupSpecifier;

            private var _cirrusNc:NetConnection;
            private var _amfphpNc:NetConnection;


            private var _groupSpec:String;
            private var seq:int = 0;

            private var _user:String;

            private var _status:String;

            private var _sendStream:NetStream;
            private var _receivingStream:NetStream;
            private var _connected:Boolean;

            public var res:Responder;

            public function init():void
            {
                 joinBtn.visible = false;
                 _status = "waiting";
                 _cirrusNc = new NetConnection(); 
                 _cirrusNc.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus); 
                 _cirrusNc.connect( SERVER + DEVKEY );
            }

            public function onResult(response:Object):void {

                //here we ask if there is another player waiting to connect to someone
                if(response == "waiting") {
                    //just wait
                }
                //if not:
                else {
                    connectToPeer(response[1]);
                }
            }

            public function sendMessage(e:Event):void {
                _sendStream.send("handler", e.currentTarget.text);
                e.currentTarget.text = "";
            }

            public function onFault(response:Object):void {
                for (var i:* in response) {
                    trace(response[i]);
                }
            }

            private function onNetStatus(event:NetStatusEvent):void {

                switch(event.info.code){
                    case "NetConnection.Connect.Success":
                        trace(event.info.code);
                        nearIDTxT.text = _cirrusNc.nearID;
                        onCirrusConnect();
                        break;
                    case "NetStream.Play.Start":
                        trace(event.info.code);
                        break;
                    case "NetStream.Connect.Success":
                        trace(event.info.code);
                        if(!_connected){
                            _connected = true;
                            farIDTxT.text = event.info.stream.farID;
                            onPeerConnect(event.info.stream.farID);
                        }
                    default:
                        trace(event.info.code);
                }
            }

            private function onCirrusConnect():void {
                //connecting to amfphp
                _amfphpNc = new NetConnection();
                _amfphpNc.connect("http://localhost/Amfphp/");
                res = new Responder(onResult, onFault);
                _amfphpNc.call("Rendezvous.match", res, NAME, _cirrusNc.nearID);

                //defining the send stream
                _sendStream = new NetStream(_cirrusNc, NetStream.DIRECT_CONNECTIONS);   
                _sendStream.client = this;
                _sendStream.publish("data");
            }

            private function connectToPeer(farID:String):void {

                farIDTxT.text = farID;

                //defining the receiving stream
                _receivingStream = new NetStream(_cirrusNc, farID); 
                _receivingStream.client = this;
                _receivingStream.play("data");
            }

            private function onPeerConnect(farID:String):void {

                farIDTxT.text = farID;

                //defining the receiving stream
                _receivingStream = new NetStream(_cirrusNc, farID); 
                _receivingStream.client = this;
                _receivingStream.play("data");
            }


            public function handler(message:String):void {
                trace(message);
                historyTxt.text = message;
            }

        ]]>
    </fx:Script>
</s:Application>


您的onPeerConnect是私有的,不能作为代理调用。将其设置为public,看看是否有效。实际上,onPeerConnect工作正常。哈,是的,对不起。。。已经很晚了。。。所以那些多个连接成功事件是正确的。。。当您的流成功连接到连接时,它们将触发。因此,当您的输入连接、输出连接等连接时,它将被调用。如果您想知道远程流何时连接,请在传入流上收听NetStream.Play.Start。把它们分开也是个好主意。。。也就是说,通过这种方式,您可以为输入流和输出流上的适当事件执行适当的操作。