2

私はアクションスクリプトが初めてです。今日、私はコードのこの部分と奇妙なことを書きましたが、動作します)))

<?xml version="1.0" encoding="utf-8"?>

        private const SERVER_ADDRESS:String = "rtmfp://p2p.rtmfp.net/bla-bla/";
        private var nc:NetConnection;
        private var ss:NetStream; 
        private var rs:NetStream; 
        private var myPeerID:String; 
        private var recvStreams:Object = new Object();
        private var sendStreams:Object = new Object();
        private var soundNewMsg:Class;



        private function initConnection():void{
            nc = new NetConnection();
            nc.maxPeerConnections = 1000;
            nc.addEventListener(NetStatusEvent.NET_STATUS, ncStatus);
            nc.connect(SERVER_ADDRESS);
        }

        public function ncStatus(event:NetStatusEvent):void{
            if(event.info.code == "NetConnection.Connect.Success"){
                myPeerID = nc.nearID;
                initSendStream();
                ExternalInterface.call("alert",nc.nearID);
            }
            else ExternalInterface.call("p2pError",event.info.code);
        }

        private function initSendStream():void{
            ss = new NetStream(nc, NetStream.DIRECT_CONNECTIONS);
            ss.publish('chat');
            var client:Object = new Object();
            client.onPeerConnect = function(subscriber:NetStream):Boolean{
                if(!sendStreams[subscriber.farID]&&!recvStreams[subscriber.farID]){
                    initReceiveStream(subscriber.farID);
                    sendStreams[subscriber.farID] = true;
                }
                return true;
            };
            ss.client = client;
        }

        private function initReceiveStream(peerID:String):void{
            rs = new NetStream(nc,peerID);
            rs.play('chat');
            var client:Object = new Object();
            client.receiveSomeData = receiveSomeData;
            rs.client = client;
            recvStreams[peerID] = true;
        }

        private function sendSomeData(str:String):void{
            if(str)ss.send('receiveSomeData', str);
        }

        private function receiveSomeData(str:String):void{
            ExternalInterface.call("receiveSomeData", str);
        }

        public function init():void{
            ExternalInterface.addCallback("initConnection",initConnection);
            ExternalInterface.addCallback("sendSomeData",sendSomeData);
            ExternalInterface.addCallback("initReceiveStream",initReceiveStream);
            ExternalInterface.call("p2pStartInit");
        }
    ]]>
</mx:Script>

js:

function getP2p(){
    if(navigator.appName.indexOf("Microsoft")!=-1)return window.p2p;
    else return document.p2p;
}

function p2pStartInit(){
    try{getP2p().initConnection()}
    catch(e){p2pError('flasherror')}
}

function initReceiveStream(p2pId){
    try{getP2p().initReceiveStream(p2pId)}
    catch(e){p2pError(e)}
}

function sendSomeData(str){
    try{getP2p().sendSomeData(str)}
    catch(e){p2pError('flasherror')}
}

function p2pError(err){
    alert(err)
}

function receiveSomeData(str,id){
    alert('Received:'+str+'/'+id)
}

およびhtml:

<input onblur="initReceiveStream(this.value)" value="initReceiveStream(p2pId)" />
<input onblur="sendSomeData(this.value)" value="sendSomeData(str)" />

そして今私がやっていること:

最初の例はオペラで開きます。それは私にそのIDを与えます。次に、mozilla で 2 番目のものを開きます。最初の入力フィールドに、オペラの例のIDを入力しました。うまくつながります。これら2つの例の間でメッセージを送受信しようとすると、すべて正常に動作します(両方ともメッセージを送受信します)

ここで私の最初の問題は次のとおりです。

他のブラウザで 3 番目の例を開き、3 番目の例の ID を 2 番目の例 (mozilla にある) の入力フィールドに入力すると、opera で「Ne​​tStream.Connect.Closed」が表示されます。Mozilla の例からメッセージを送信しようとすると、このメッセージは Opera と 3 番目のブラウザの両方に表示されます。しかし、オペラからメッセージを送信しようとすると、どこにも行きません。Opera からのメッセージを mozilla に送信し、mozilla からのメッセージをすべての例に送信するにはどうすればよいですか?

2番目の問題は次のとおりです。

最初の例で成功したら、2 番目の例 (接続されているすべてのチャットの ID を含む必要があります) でメッセージの送信先を選択できるようにしたいと思います: 最初の例、または 3 番目の例、またはそれらの両方に? どうすればそれを達成できますか?

助けてくれてどうもありがとう!

4

2 に答える 2

2

実際、私はちょうどそれを行う方法を見つけました。

<?xml version="1.0" encoding="utf-8"?>

        import mx.collections.ArrayCollection;

        private const SERVER_ADDRESS:String = "rtmfp://p2p.rtmfp.net/bla-bla/";
        private var nc:NetConnection;
        private var ss:NetStream; 
        private var rs:NetStream;
        private var myPeerID:String; 
        private var recvStreams:Object = new Object();
        private var sendStreams:Object = new Object();
        private var soundNewMsg:Class;



        private function initConnection():void{
            nc = new NetConnection();
            nc.maxPeerConnections = 1000;
            nc.addEventListener(NetStatusEvent.NET_STATUS, ncStatus);
            nc.connect(SERVER_ADDRESS);
        }

        public function ncStatus(event:NetStatusEvent):void{
            ExternalInterface.call("p2pError",event.info.code);
            if(event.info.code == "NetConnection.Connect.Success"){
                myPeerID = nc.nearID;
                initSendStream();
                ExternalInterface.call("alert",nc.nearID);
            }
        }

        private function initSendStream():void{
            ss = new NetStream(nc, NetStream.DIRECT_CONNECTIONS);
            ss.publish('chat');
            var client:Object = new Object();
            client.onPeerConnect = function(subscriber:NetStream):Boolean{
                if(!sendStreams[subscriber.farID])sendStreams[subscriber.farID] = subscriber;
                if(!recvStreams[subscriber.farID])initReceiveStream(subscriber.farID);
                return true;
            }
            ss.client = client;
        }

        private function initReceiveStream(peerID:String):void{
            if(peerID){
                rs = new NetStream(nc,peerID);
                rs.play('chat');
                var client:Object = new Object();
                client.receiveSomeData = receiveSomeData;
                rs.client = client;
                var peer:Object = new Object();
                peer.stream = rs;
                recvStreams[peerID] = peer;
            }
        }

        private function sendSomeData(str:String,farIds:String):void{
            if(str!=null&&str!=""){
                str = str.replace(/(^[\r\n\t\s]+)|([\r\n\t\s]$)/g,"");
                farIds = farIds == null ? "" : farIds.replace(/[^a-z0-9;]/gi,"");
                if(farIds!=""){
                    var farId:Array = farIds.split(";");
                    for(var i:int;i<farId.length;i++){
                        if(farId[i]&&sendStreams[farId[i]]){
                            sendStreams[farId[i]].send('receiveSomeData', str, myPeerID);
                        }
                    }
                }
                else{
                    for(var id:String in sendStreams){
                        sendStreams[id].send('receiveSomeData', str, myPeerID);
                    }
                }
            }
        }

        private function receiveSomeData(str:String, farId:String):void{
            ExternalInterface.call("receiveSomeData", str, farId);
        }

        public function init():void{
            ExternalInterface.addCallback("initConnection",initConnection);
            ExternalInterface.addCallback("sendSomeData",sendSomeData);
            ExternalInterface.addCallback("initReceiveStream",initReceiveStream);
            ExternalInterface.call("p2pStartInit");
        }
    ]]>
</mx:Script>

グーグルが私に嘘をつかなかったことを願っています)

于 2013-04-23T23:35:52.440 に答える
0

最初の問題: はい、サブスクライバーのストリーム オブジェクトをどこかに (onPeerConnect ハンドラー内から) 保持する必要があります。これにより、古いクライアントをドロップすることなく、複数のクライアントがパブリッシング ストリームに接続できるようになります。

于 2013-10-14T12:44:29.850 に答える