Прямое одноранговое соединение RTMFP, работающее в Windows XP, но не в Windows 7 - PullRequest
1 голос
/ 01 марта 2012

у нас тут странная проблема с проектом.Когда мы используем NetConnection в сочетании с NetGroup для инициирования связи между двумя локальными приложениями AIR в Windows XP, они всегда оба успешно подключаются к NetGroup и обнаруживают друг друга как соседей.Однако в Windows 7 оба приложения успешно подключаются к NetConnection и NetGroup, и оба не обнаруживают друг друга как соседей.

Чтобы воспроизвести эту проблему, вот два приложения 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 и какие шаги можно предпринять, чтобы заставить его работать?Для нашего проекта очень важно, чтобы это работало.

Ps: в некоторых случаях приложениям требуется довольно много времени, чтобы обнаружить друг друга как соседей (до 15 секунд в некоторых случаях), в других случаях они обнаруживают каждыйпосмотри сразу.Кто-нибудь знает, что может вызвать эту задержку?

1 Ответ

0 голосов
/ 01 марта 2012

Мое первое предположение было бы связано с брандмауэром или сетью. RTMFP использует UDP-порт 1935 , который является нестандартным, и многие корпоративные брандмауэры блокируют все, что не является портом 80 или 443 (HTTP, HTTPS).

Вот почему рекомендуется использовать резервный сервер стороннего производителя, если p2p не работает, потому что это не всегда так.

...