2012-03-01 43 views
1

ここではプロジェクトに奇妙な問題があります。 NetConnectionをNetGroupと組み合わせて使用​​して、Windows XP上の2つのローカルAIRアプリケーション間の通信を開始すると、それらは常にNetGroupに正常に接続し、互いに近接して検出します。ただし、Windows 7では、両方のアプリケーションがNetConnectionとNetGroupに正常に接続されているため、両方がネイバーとして互いに検出されません。ここRTMFPピアツーピア接続はWindows XPで動作しますが、Windows 7では動作しません。

この問題を再現するには、2つのAIRアプリケーションは、次のとおりです。

RTMFP1:

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

</fx:Declarations> 
<fx:Script> 
    <![CDATA[ 
     private var nc:NetConnection; 

     private var group:NetGroup; 

     [Bindable] 
     private var connected:Boolean = false; 


     private function init():void 
     { 
      connect(); 
     } 

     private function connect():void 
     { 
      nc = new NetConnection(); 
      nc.addEventListener(NetStatusEvent.NET_STATUS, netStatus); 
      nc.connect("rtmfp:"); 
     } 

     private function netStatus(event:NetStatusEvent):void 
     { 
      writeText(event.info.code); 

      switch (event.info.code) 
      { 
       case "NetConnection.Connect.Success": 
        setupGroup(); 
        break; 

       case "NetGroup.Connect.Success": 
        connected = true; 
        break; 

       case "NetGroup.Posting.Notify": 
        receiveMessage(event.info.message) 
        break; 
      } 
     } 

     private function setupGroup():void 
     { 
      var groupspec:GroupSpecifier = new GroupSpecifier("myGroup/groupOne"); 
      groupspec.postingEnabled = true; 
      groupspec.ipMulticastMemberUpdatesEnabled = true; 
      groupspec.addIPMulticastAddress("127.0.0.1:30302"); 

      group = new NetGroup(nc, groupspec.groupspecWithAuthorizations()); 
      group.addEventListener(NetStatusEvent.NET_STATUS, netStatus); 
     } 

     private var i:int = 0; 

     private function sendMessage():void 
     { 
      var message:Object = new Object(); 
      message.sender = group.convertPeerIDToGroupAddress(nc.nearID); 
      message.text = "Here's your message!"; 
      message.random = i++; 
      group.post(message); 
     } 

     public function receiveMessage(message:Object):void 
     { 
      writeText(message.text); 
     } 

     private function writeText(txt:String):void 
     { 
      txtHistory.text += txt + "\n"; 
     } 


     private function btnSend_clickHandler(event:MouseEvent):void 
     { 
      sendMessage(); 
     } 
    ]]> 
</fx:Script> 
<s:layout> 
    <s:VerticalLayout/> 
</s:layout> 
<s:TextArea id="txtHistory" 
    width="100%" height="100%"/> 
<s:Button id="btnSend" 
    enabled="{connected}" 
    label="Send message" 
    click="btnSend_clickHandler(event)"/> 
</s:WindowedApplication> 

RTMFP2:

<?xml version="1.0" encoding="utf-8"?> 
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
xmlns:s="library://ns.adobe.com/flex/spark" 
xmlns:mx="library://ns.adobe.com/flex/mx" 
applicationComplete="connect()"> 
<fx:Declarations> 
    <!-- Place non-visual elements (e.g., services, value objects) here --> 
</fx:Declarations> 
<fx:Script> 
    <![CDATA[ 
     private var nc:NetConnection; 

     private var group:NetGroup; 

     [Bindable] 
     private var connected:Boolean = false; 


     private function connect():void 
     { 
      nc = new NetConnection(); 
      nc.addEventListener(NetStatusEvent.NET_STATUS, netStatus); 
      nc.connect("rtmfp:"); 

     } 

     private function netStatus(event:NetStatusEvent):void 
     { 
      switch (event.info.code) 
      { 
       case "NetConnection.Connect.Success": 
        setupGroup(); 
        break; 

       case "NetGroup.Connect.Success": 
        connected = true; 
        break; 

       case "NetGroup.Posting.Notify": 
        receiveMessage(event.info.message) 
        break; 
      } 
     } 

     private function setupGroup():void 
     { 
      var groupspec:GroupSpecifier = new GroupSpecifier("myGroup/groupOne"); 
      groupspec.postingEnabled = true; 
      groupspec.ipMulticastMemberUpdatesEnabled = true; 
      groupspec.addIPMulticastAddress("127.0.0.1:30302"); 

      group = new NetGroup(nc, groupspec.groupspecWithAuthorizations()); 
      group.addEventListener(NetStatusEvent.NET_STATUS, netStatus); 
     } 

     private var i:int = 0; 

     private function sendAcknowledge():void 
     { 
      var message:Object = new Object(); 
      message.text = "We received your message!"; 
      message.sender = group.convertPeerIDToGroupAddress(nc.nearID); 
      message.sequence = i++; 
      group.post(message); 
     } 

     public function receiveMessage(message:Object):void 
     { 
      writeText(message.text); 
      sendAcknowledge(); 
     } 

     private function writeText(txt:String):void 
     { 
      textArea.text += txt + "\n"; 
     } 
    ]]> 
</fx:Script> 
<s:layout> 
    <s:VerticalLayout/> 
</s:layout> 
<s:TextArea id="textArea" width="100%" height="100%"/> 
</s:WindowedApplication> 

これらのアプリケーションは問題なく接続し、相互にメッセージを送ることができますWindows XPの場合しかし、Windows 7では、そうすることはできません。

Windows 7でこれが動作しない理由を知っている人はいますか?私たちのプロジェクトにとってはこれが重要です。

P .:いくつかのケースでは、アプリケーションが互いに近接して検出されるまでにかなりの時間がかかります(場合によっては15秒まで)。誰でもこの遅延を引き起こす可能性があることを知っていますか?

+0

私は、XPと7の間で何が起こっているのかを見るために、wireshark(プロトコル、ソース、および宛先を適切にフィルタリングして余分なパケットをすべて見るのを避けるため)を使ってデバッグすることをお勧めします。 – shaunhusain

答えて

0

私の最初の推測は、ファイアウォールまたはネットワークのどちらかを行うことです。 RTMFPは UDP port 1935を標準ではなく、多くの企業ファイアウォールがポート80または443(HTTP、HTTPS)以外のすべてをブロックします。

これは、常にそうであるとは限らないため、p2pが機能しない場合は、サードパーティのサーバーフォールバックをお勧めします。