オンライン Flash マルチプレーヤー ゲームでプレーヤー間でデータを渡すために NetStream を少し試しています。
NetConnection クラスによるイベント ディスパッチを使用して、クライアントの現在の状態を把握しています。
たとえば、「NetConnection.Connect.Success」がある場合、NetStream クラスの使用を開始して NetConnection オブジェクトを渡すことができることがわかります。
すべてが理にかなっており、正常に動作します。
しかし、NetStream.Connect.Success イベントをリッスンするときに問題が発生します。このイベントは理由もなく複数回発生するようです。2 人のユーザーが相互に接続したときに初めて発生します。これは問題ありません。farID を確認して他のピアに渡すことができ、すべて正常に動作します。
ただし、これらのピア間の最初の接続の後、明らかな理由もなく、さらに 3 つまたは 4 つの NetStream.Connect.Success が発生します。なぜそれが起こっているのか理解できないので、それは私を悩ませるだけでなく、どのイベントが発生したかに関して次に何をすべきかを決定するために、私の「イベントベース」アーキテクチャを壊します。
通常数秒後に発生する NetStream.Connect.Closed を取得するまで、問題なくメッセージを送受信できます。クローズド イベントが発生しない場合もあれば、イベントが発生してもメッセージを送受信できる場合があります。現在使用している接続ではなく、別の接続がクローズされたようです。
ご覧のとおり、本当にごちゃごちゃしています。何かミスをしているのか、それともイベント システム全体の設計が悪いのかわかりません。
私が正しくやっているかどうかわからないもう1つのことは、送信ストリームと受信ストリームのクライアントプロパティを「これ」に割り当てることです.この奇妙な動作の責任はありません。
(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>