2012-02-13 3 views
0

안녕하세요 저는 Flex를 사용하여 채팅을하고 있습니다. 문제는 새 사용자가 모든 사용자를 온라인에서 삭제하고 모든 사용자의 목록에 추가하는 방법입니다. 나는 "callerns"dataProvider를 통해 데이터 그리드에이 정보를 넣어보십시오Flex, 연결된 모든 사용자간에 사용자 이름과 피어 ID를 교환하는 방법

[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}); 
     } 
: 여기
<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> 

코드의 일부이다

이 기능은 작동하지 않으며 새로운 사용자는 그리드에 추가되지 않습니다. 이 문제를 해결할 수 있도록 도와 주시겠습니까?

+0

어떤 종류의 서비스를 randezvous에 사용하고 있습니까? 정확히 작동하지 않는 것은 무엇입니까? –

+0

나는 Cirrus를 사용하고 있습니다. 기본적으로 나는 나의 임무를 해결한다. 나는 NetGroup 기회를 통해 그것을 해냈습니다. 또한 여기에 언급 된대로 할 수 있습니다 : http://blog.leeburrows.com/2011/11/p2p-flash-on-a-local-network-part-2/하지만 peerID에만 적합합니다. 사용자 이름에도이 방법을 사용 하시겠습니까? 답변 주셔서 감사합니다! – Zhekka

답변

0

제거 된 원래의 게시물이 작품, 내가 틀렸다 것 같다

<?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> 

그래서 내가 원래 잘못 버튼을 타격하면 그리드에 대한 업데이트를 일으킬 않습니다. 당신이 구축하고있는 튜토리얼에 대한 링크를 게시했다면, 그것을 찾았고 스파크로 잘 작동하도록 만들었 더라면 매우 도움이되었을 것입니다. 나는이 부분은 이미 알아 냈있어 가정하지만, 여기에 기본 채팅 클라이언트입니다 해요 :

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

내가 뭘 잘못하지만 같은거야 잘 모르겠어요 :

<?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> 

여기에 개발자 키를 가져옵니다 위의 주석 작성자는 디버깅 할 때 발생하는 상황을 정확하게 포함시켜야한다고 말합니다 (사용하는 브라우저에 상관없이 디버그 플래시 플레이어를 설치해야합니다. 크롬은 기본적으로 자체 플러그인을 관리합니다). 콘솔, 당신은 어떤 오류 등받을 수 있습니까? 튜토리얼 응용 프로그램은 나를 위해 잘 작동, 두 가지 방법 으로이 거래를하는 데 commu 모든 연결된 동료 목록을 유지하고 유지하는 것이 올바른 목표 인 것 같습니다.

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

내가 원하는 당신이 시작하고 어디는 모든 향하고있는 위치에 대한 자세한 정보를 포함했을 것이다 : 나는 또한 넷 그룹에 대한 질문을 이해하지 않는, 비록 여기 있음을 덮 P2P에 더있다 이 비록 (그리고 코드, 난 항상 더 많은 코드를 원한다 :)

+0

답변 해 주셔서 감사합니다! 나는 NetGroup 기회를 통해 그것을 해냈습니다. 임시 수집 중 무엇을 의미합니까? netGroup을 사용하지 않고 완료 할 수 있습니까? – Zhekka

관련 문제