Flex, как обмениваться именами пользователей и идентификаторами между всеми подключенными пользователями - PullRequest
0 голосов
/ 13 февраля 2012

Здравствуйте, я создаю чат, используя Flex. Проблема в том, как сделать так, чтобы этот новый пользователь получал списки всех пользователей онлайн и добавлял их в списки всех пользователей. Я пытаюсь поместить эту информацию в DataGrid через dataProvider "callerns":

<s:DataGrid x="10" y="125" width="238" height="125" alternatingRowColors="[ #67676767, #555555]"
            borderVisible="true" chromeColor="#555555" color="#CCCCCC"
            contentBackgroundColor="#555555" dataProvider="{callerns}" fontWeight="bold"
            requestedRowCount="4" rollOverColor="#08700D" selectionColor="#08700D"
            symbolColor="#CCCCCC">
    <s:columns>
        <s:ArrayList>
            <s:GridColumn dataField="name" headerText="USER ONLINE"></s:GridColumn>
            <s:GridColumn dataField="peerID" headerText="USER ID"></s:GridColumn>
        </s:ArrayList>
    </s:columns>
</s:DataGrid>

Вот часть кода:

 [Bindable]
  private var callerns:ArrayCollection = new ArrayCollection();

...........

private function netStatusEvent(event:NetStatusEvent):void{

            trace('NetConnection status event (1): ' + event.info.code);

            //writeText(event.info.code);

            switch(event.info.code){
                case "NetConnection.Connect.Success":
                    log('Connected (NearID: '+nc.nearID+')', 'debug');
                    log('Connection sucsessful');

                    MyPeerID = nc.nearID;
                    txtFingerprint.text = MyPeerID;
                    initSendNetStream();
                    callerns.addItem({peerID: MyPeerID, name: myName});
                    setupGroup();                       
                    break;

                case "NetGroup.Posting.Notify":
                    receiveMessage(event.info.message);
                    log('Message posted');
                    break;

                case "NetGroup.Connect.Success":
                    log('Net Group connection sucsessful');
                    connected = true;
                    break;

                case 'NetStream.Connect.Success':
                    log('Peer Connected (FarID: '+event.info.stream.farID+')', 'debug');
                    break;

                case "NetGroup.Neighbor.Connect":
                    log('New user connected');
                    break;

            }

        }  

private function initSendNetStream():void{
            trace("initSendStream");

            sendStream = new NetStream(nc,NetStream.DIRECT_CONNECTIONS);
            sendStream.addEventListener(NetStatusEvent.NET_STATUS, netStatusEvent);
            var clientObject:Object = new Object();
            clientObject.onPeerConnect = function(callerns:NetStream):Boolean{

                initRecvStream(callerns.farID);
                callerns.send('onPeerNameUpdate', MyPeerID, myName);

                return true;
            }

            sendStream.client = clientObject;
            sendStream.publish('video');
            log('Net Stream publish start');

        }   

        private function initRecvStream(peerID:String):void {
            //log('initRecvStream', 'debug');

            var stream:NetStream = new NetStream(nc, peerID);
            stream.addEventListener(NetStatusEvent.NET_STATUS, netStatusEvent);
            stream.play('video');

            var client:Object = new Object();
            client.onPeerNameUpdate = onPeerNameUpdate;

            stream.client = client;

            var peer:Object = new Object();
            peer.stream = stream;

            recvStreams[peerID] = peer;
        }

        private function onPeerNameUpdate(peerID:String, name:String):void {
            //log('onPeerNameUpdate received: '+peerID+':'+name, 'debug');
            //log(name+' connected to your channel', 'debug');
            callerns.addItem({peerID: peerID, name: name});
        }

К сожалению, это не работает, и новые пользователи не добавляются в сетку. Не могли бы вы помочь мне решить эту проблему?

1 Ответ

0 голосов
/ 15 февраля 2012

Удалено оригинальное сообщение, кажется, я ошибаюсь, это работает:

<?xml version="1.0" encoding="utf-8"?>
<s:Group creationComplete="group1_creationCompleteHandler(event)"
         height="100%"
         width="100%"
         xmlns:fx="http://ns.adobe.com/mxml/2009"
         xmlns:mx="library://ns.adobe.com/flex/mx"
         xmlns:s="library://ns.adobe.com/flex/spark">
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;
            import mx.events.FlexEvent;

            [Bindable]
            private var callerns : ArrayCollection;

            protected function group1_creationCompleteHandler(event : FlexEvent) : void
            {
                callerns = new ArrayCollection();
            }

            protected function addItemClickHandler(event : MouseEvent) : void
            {
                callerns.addItem({peerID: "somePeerID", name: "someName"});
            }
        ]]>
    </fx:Script>
    <s:layout>
        <s:VerticalLayout/>
    </s:layout>
    <s:Button click="addItemClickHandler(event)"
              label="Add Item"/>
    <s:Button click="propertyChangeClickHandler(event)"
              label="Dispatch Property Change"/>
    <s:DataGrid alternatingRowColors="[ #67676767, #555555]"
                borderVisible="true"
                chromeColor="#555555"
                color="#CCCCCC"
                contentBackgroundColor="#555555"
                dataProvider="{callerns}"
                fontWeight="bold"
                height="125"
                requestedRowCount="4"
                rollOverColor="#08700D"
                selectionColor="#08700D"
                symbolColor="#CCCCCC"
                width="238"
                x="10"
                y="125">
        <s:columns>
            <s:ArrayList>
                <s:GridColumn dataField="name"
                              headerText="USER ONLINE">
                </s:GridColumn>
                <s:GridColumn dataField="peerID"
                              headerText="USER ID">
                </s:GridColumn>
            </s:ArrayList>
        </s:columns>
    </s:DataGrid>
</s:Group>

Так что я изначально ошибался, нажатие на кнопку вызывает обновление сетки. Было бы очень полезно, если бы вы опубликовали ссылку на оригинальный учебник, из которого вы строили, я нашел его и получил, что он отлично работает со свечой. Я предполагаю, что вы уже поняли эту часть, но вот основной клиент чата:

<?xml version="1.0" encoding="utf-8"?>
<s:Application minHeight="600"
               minWidth="955"
               xmlns:fx="http://ns.adobe.com/mxml/2009"
               xmlns:mx="library://ns.adobe.com/flex/mx"
               xmlns:s="library://ns.adobe.com/flex/spark">
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <fx:Script>
        <![CDATA[
            private const SERVER_ADDRESS : String = "rtmfp://p2p.rtmfp.net/";
            private const DEVELOPER_KEY: String = PUT_YOUR_DEV_KEY_HERE;

            private var nc : NetConnection;
            private var myPeerID : String;
            private var farPeerID : String;
            // streams
            private var sendStream : NetStream;
            private var recvStream : NetStream;

            private function initConnection() : void
            {
                if (txtFingerprint.text)
                {
                    farPeerID = txtFingerprint.text;
                }

                nc = new NetConnection();
                nc.addEventListener(NetStatusEvent.NET_STATUS, ncStatus);
                nc.connect(SERVER_ADDRESS + DEVELOPER_KEY);
            }

            private function ncStatus(event : NetStatusEvent) : void
            {
                trace(event.info.code);

                myPeerID = nc.nearID;

                txtFingerprint.text = myPeerID;
            }

            private function initSendStream() : void
            {
                trace("initSendStream");

                sendStream = new NetStream(nc, NetStream.DIRECT_CONNECTIONS);
                sendStream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
                sendStream.publish("media");

                var sendStreamClient : Object = new Object();
                sendStreamClient.onPeerConnect = function(callerns : NetStream) : Boolean
                {

                    farPeerID = callerns.farID;

                    trace("onPeerConnect " + farPeerID);

                    return true;
                }

                sendStream.client = sendStreamClient;

            }

            private function initRecvStream() : void
            {
                recvStream = new NetStream(nc, farPeerID);
                recvStream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
                recvStream.play("media");

                recvStream.client = this;
            }

            public function receiveSomeData(str : String) : void
            {
                txtReceiveData.text = str;
            }

            private function sendSomeData() : void
            {
                sendStream.send("receiveSomeData", txtSendData.text);
            }

            private function netStatusHandler(event : NetStatusEvent) : void
            {
                trace(event.info.code);
            }
        ]]>
    </fx:Script>
    <mx:TextInput id="txtFingerprint"
                  width="391"
                  x="10"
                  y="10"/>
    <mx:Button click="initConnection()"
               label="Connect"
               x="409"
               y="10"/>
    <mx:TextInput id="txtSendData"
                  x="10"
                  y="40"/>
    <mx:TextInput id="txtReceiveData"
                  width="251"
                  x="10"
                  y="70"/>
    <mx:Button click="sendSomeData()"
               label="Send data"
               x="178"
               y="40"/>
    <mx:Button click="initSendStream()"
               label="initSendStream"
               x="10"
               y="100"/>
    <mx:Button click="initRecvStream();"
               label="initReceiveStream"
               x="132"
               y="100"/>
    <mx:Text height="122"
             text="Hint: First running Flash app - click Connect to get Fingerprint PeerID. Copy and paste this PeerID to second running Flash app to the same field and click Connect. Then initSendStream and initReceiveStream on both of them and finally you can write some text and click Send data."
             width="391"
             x="10"
             y="130"/>

</s:Application>

Получите ключ разработчика здесь:

http://www.adobe.com/cfusion/entitlement/index.cfm?e=cirrus

Я не уверен, что что-то идет не так, но, как сказано выше, комментатор должен указать, как именно он ломается, то есть то, что происходит при отладке (обязательно установите Flash Player для отладки для любого браузера, который вы используете, остерегайтесь Chrome по умолчанию управляет своим собственным плагином) что вы видите в консоли, есть ли у вас какие-либо ошибки и т. д. Учебное приложение прекрасно работает для меня, так как задача состоит в двусторонней связи и поддержании списка всех подключенных пиров, кажется правильный? Я также не понимаю вопроса о NetGroup, но здесь есть еще кое-что о P2P:

http://www.adobe.com/devnet/flashmediaserver/articles/p2p_rtmfp_groups.html

Хотелось бы, чтобы вы включили больше информации о том, с чего вы начали и куда идете, хотя (и код, я всегда хочу больше кода:)

...