2015-01-22 9 views
0

다른 장치 사이에 서버가없는 P2P LAN 연결을 만들기 위해 간단한 AS3 프로그램을 작성했습니다. 여기의 요지는 다음과 같습니다두 장치 사이의 LAN이 작동하지 않습니다.

클라이언트 :

private function initLan():void 
    { 
     //G is a class with two static variables - netConnection and netGroup 
     G.netConnection = new NetConnection(); 
     G.netConnection.addEventListener(NetStatusEvent.NET_STATUS, setupLAN); 
     G.netConnection.connect("rtmfp:"); 
    } 

    private function setupLAN(e:NetStatusEvent):void 
    { 
     trace(e.info.code); 
     switch (e.info.code) 
     { 
      case "NetGroup.Connect.Failed": 
      case "NetGroup.Connect.Rejected": 
      case "NetConnection.Connect.Rejected": 
      case "NetConnection.Connect.Failed": 
       trace("There was a problem :/\n+" + e.info.code); 
       break; 

      case "NetConnection.Connect.Success": 
       trace("Setting up LAN group.."); 
       setupGroup(); 
       break; 

      case "NetGroup.Connect.Success": 
       trace("LAN group successful!"); 

       //Start bind requests 
       beginBindRequests(); 

       break; 

      case "NetGroup.SendTo.Notify": 
       var msg:Object = e.info.message; 

       if (msg.type == "BIND RESPONSE") { 
        endBindRequests(); //See beginBindRequests(); 
        G.netConnection.removeEventListener(NetStatusEvent.NET_STATUS, setupLAN); 
        G.netGroup.removeEventListener(NetStatusEvent.NET_STATUS, setupLAN); 

        //Connection established. 
       } 

       break; 
     } 
    } 

    private function setupGroup():void 
    { 
     var groupspec:GroupSpecifier = new GroupSpecifier("LAN CONNECTION"); 
     groupspec.postingEnabled = true; 
     groupspec.routingEnabled = true; 
     groupspec.ipMulticastMemberUpdatesEnabled = true; 
     groupspec.addIPMulticastAddress("225.225.0.1:30303"); 

     G.netGroup = new NetGroup(G.netConnection, groupspec.groupspecWithAuthorizations()); 
     G.netGroup.addEventListener(NetStatusEvent.NET_STATUS,setupLAN); 
    } 

    private function beginBindRequests():void 
    { 
     function requestBind():void { 
      G.netGroup.sendToAllNeighbors({ type:"BIND REQUEST" }); 
     } 

     //Code running requestBind() until endBindRequests() is called 
    } 

서버 : 동일 PC에서 컴파일 된 국부 펀드의 두 인스턴스를 실행할 때 잘 작동

private function initLAN():void 
    { 
     //G is a class with two static variables - netConnection and netGroup 
     G.netConnection = new NetConnection(); 
     G.netConnection.addEventListener(NetStatusEvent.NET_STATUS, setupLAN); 
     G.netConnection.connect("rtmfp:"); 
    } 

    private function setupLAN(e:NetStatusEvent):void 
    { 
     switch (e.info.code) 
     { 
      case "NetGroup.Connect.Failed": 
      case "NetGroup.Connect.Rejected": 
      case "NetConnection.Connect.Rejected": 
      case "NetConnection.Connect.Failed": 
       trace("There was a problem :/\n+" + e.info.code); 
       break; 

      case "NetConnection.Connect.Success": 
       trace("Setting up LAN group.."); 
       setupGroup(); 
       break; 

      case "NetGroup.Connect.Success": 
       trace("LAN group successful!"); 

       //Add hot controller function 
       G.netConnection.addEventListener(NetStatusEvent.NET_STATUS, bindResponses); 
       G.netGroup.addEventListener(NetStatusEvent.NET_STATUS, bindResponses); 

       G.netGroup.removeEventListener(NetStatusEvent.NET_STATUS, setupLAN); 
       G.netConnection.removeEventListener(NetStatusEvent.NET_STATUS, setupLAN); 
       break; 
     } 
    } 

    private function setupGroup():void 
    { 
     var groupspec:GroupSpecifier = new GroupSpecifier("LAN CONNECTION"); 
     groupspec.postingEnabled = true; 
     groupspec.routingEnabled = true; 
     groupspec.ipMulticastMemberUpdatesEnabled = true; 
     groupspec.addIPMulticastAddress("225.225.0.1:30303"); 

     G.netGroup = new NetGroup(G.netConnection,groupspec.groupspecWithAuthorizations()); 
     G.netGroup.addEventListener(NetStatusEvent.NET_STATUS, setupLAN); 
    } 

    private function bindResponses(e:NetStatusEvent):void 
    { 
     detailText.text = e.info.code; 
     switch (e.info.code) 
     { 
      case "NetGroup.SendTo.Notify": 
       if (e.info.message.type == "BIND REQUEST") 
       { 
        //Send bind response 
        G.netGroup.sendToNearest({type: "BIND RESPONSE"}, e.info.from); 
       } 
       break; 
     } 
    } 

하지만, 아무튼 클라이언트가 실행 중일 때 작동합니다 (예 : AIR - 예, <uses-permission android:name="android.permission.INTERNET" />이 설정 됨)되고 서버가 PC (AIR 응용 프로그램)로 실행 중일 때 작동합니다.
e.info.codesetupLan()에 추적하면 다른 장치에서 두 인스턴스가 서로 "보지"못합니다 (NetGroup.Neighbor.Connect는 절대로 실행되지 않음). EDIT : 테스트를 마쳤으며 클라이언트/서버 AIR 앱을 실행하는 두 대의 PC도 서로를 볼 수 없습니다.
최악의 경우는 동일한 코드가 다른 FlashDevelop 프로젝트에 있었지만 한 번 작동하여 작동한다는 것입니다. 어쩐지. 나는 절대 좌절하고 좌절감을 느낍니다. 도움. 부디.


추신. 가능한 경우 (나는 의심 스럽다) 라우터/방화벽 설정에 간섭하는 것을 포함하지 않는 솔루션은 대부분의 최종 사용자가 그 정도까지는 앱을 사용하지 않기 때문에 크게 감사 할 것입니다. 또한 두 개의 다른 라우터를 테스트했으며 문제가 지속됩니다.

답변

0

문제는 컴퓨터 자체가 아니라 코딩 또는 배포 문제였습니다. LAN이 올바로 생성되었지만 네트워크가 잘못되었습니다. this link의 단계를 따르면 문제가 해결되었습니다.