⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 packetreceiver.java

📁 java B++树 一个很好的算法来实现这些问题 推荐!
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
                srcNode.nodeState != ParentNode.RM_STATUS ) {
                return;
            }
        }
        MddbPacket newPacket = new MddbPacket( new Point( srcNode.position ),
                                               srcNode.ID,
                                               new Point( packet.getSrcAddr() ),
                                               packet.getPathLength(),
                                               contraryRoutine( packet ),
                                               MddbPacket.NET_RM,
                                               packet.getTimeStamp() );
        newPacket.setData( "@" );
        srcNode.m_DelayQueue.add( newPacket );
    }

    //RRM专用==================================================================
    //对于节点的状态变量的访问以及距离的设定都需要进行同步
    private synchronized void rrmProc( MddbPacket packet ) {
        if( packet.getTimeStamp() != srcNode.timeStamp ||
            srcNode.nodeState != ParentNode.RM_STATUS ) {
            return;
        }
        srcNode.masterId = packet.getSrcId();
        srcNode.mbrList.clear();
        srcNode.groupAdjacencyList.clear();
        //另RMTimer超时
        srcNode.nodeTimer.OnOverRMTime();
        return;
    }

    //RM专用===================================================================
    private MddbPacket rmProc( MddbPacket packet, int dataLength ) {
        if( srcNode.isMaster() ) {
            //返回Delay包,路由应该是相反的
            if( srcNode.nodeState == ParentNode.RM_STATUS ) {
                //返回Delay包
                MddbPacket mp = new MddbPacket( new Point( srcNode.position ),
                                                srcNode.ID,
                                                new Point( packet.getSrcAddr() ),
                                                packet.getPathLength(),
                                                contraryRoutine( packet ),
                                                MddbPacket.NET_DELAY,
                                                packet.getTimeStamp()
                                                );
                mp.setData( "@" );
                return mp;
            }
        }
        else {
            synchronized ( srcNode.mbrList ){
                srcNode.mbrList.add( packet.getSrcId(), packet.getSrcAddr() );
            }
            //返回RRM包
            MddbPacket mp = new MddbPacket( new Point( srcNode.position ),
                                            srcNode.ID,
                                            new Point( packet.getSrcAddr() ),
                                            packet.getPathLength(),
                                            contraryRoutine( packet ),
                                            MddbPacket.NET_RRM,
                                            packet.getTimeStamp()
                                            );
            mp.setData( "@" );
            return mp;
        }
        return null;
    }

    //REHELLO包专用函数==========================================================
    //这是HELLO和RHELLO处理中都需要用到的
    private synchronized void hello_rehello_Process( MddbPacket packet ) {
        if( srcNode.isMaster() ) {
            if( isSelfMember( packet.getSrcId() ) && //Hello发送者是自己的成员
                ( overValidRang( packet.getPathLength(), packet ) ||
                  hasBecameMaster( packet ) ) ) {
                //删除成员表中相应的项
                srcNode.mbrList.remove( packet.getSrcId() );
                //删除邻接表中相应的项
                int removePos;
                if( ( removePos = srcNode.groupAdjacencyList.
                      containsGatewayId( packet.getSrcId(),
                                         GroupAdjacencyList.
                                         LOCAL_GATEWAY_ID ) ) >= 0 ) {
                    srcNode.groupAdjacencyList.remove( removePos );
                }
            }
        }
        else {
            if( packet.getSrcId() == srcNode.masterId &&
                ( overValidRang( packet.getPathLength(), packet ) ||
                  !hasBecameMaster( packet ) ) ) {
                srcNode.mkAcnode(); //使自己成为孤点
            }
        }
    }

    private synchronized void rehelloProc( MddbPacket reHelloPacket ) {
        if( reHelloPacket.getTimeStamp() != srcNode.timeStamp ||
            srcNode.nodeState != ParentNode.HELLO_STATUS ) {
            return;
        }
        //将RHELLO包的信息存入下面的变量中
        System.out.println( "结点" + srcNode.ID + "收到来自" + reHelloPacket.getSrcId() +
                            "的reHello包!" );
        srcNode.m_RHELLOList.add( new MddbPacket( reHelloPacket ) );
        hello_rehello_Process( reHelloPacket );
        return;
    }

    //HELLO包专用函数=============================================================
    private MddbPacket helloProc( MddbPacket helloPacket,
                                               int dataLength ) {
        //用HELLO包更新邻居表
        synchronized( srcNode.nebrList){
            srcNode.nebrList.add( helloPacket.getSrcId(),
                                  Long.parseLong( helloPacket.getData() ),
                                  helloPacket.getSrcAddr() );
        }
        //将Hello和ReHello的处理提炼到这个函数中
        hello_rehello_Process( helloPacket );
        //加入路径列表
        ArrayList temp = new ArrayList();
        temp.add( srcNode.position );
        temp.add( helloPacket.getSrcAddr() );
        MddbPacket reHelloPacket = new MddbPacket( new Point( srcNode.position ),
            srcNode.ID,
            new Point( helloPacket.getSrcAddr() ),
            helloPacket.getPathLength(),
            temp,
            MddbPacket.NET_RHELLO,
            helloPacket.getTimeStamp()
            );
        //System.out.println("ReceivePacket'sNodeId="+srcNode.ID);
        StringBuffer sb = new StringBuffer();
        //加入masterId
        sb.append( srcNode.masterId + "@" );
        //加入成员数--至少是1
        if( srcNode.isMaster() ) {
            sb.append( srcNode.mbrList.getSize() + "@" );
        }
        else {
            sb.append( 0 + "@" ); //非Master节点没有成员
            //加入与HELLO发送者之间的距离
        }
        sb.append( srcNode.getDistance( srcNode.ID, helloPacket.getSrcId() ) +
                   "@" );
        //加入HeighbourList的值
        Object[] nebrTemp;
        synchronized( srcNode.nebrList ){
            for( int i = 0; i < srcNode.nebrList.getSize(); i++ ) {
                nebrTemp = srcNode.nebrList.get( i );
                sb.append( nebrTemp[0] + ":" );
                sb.append( nebrTemp[1] + ":" );
                sb.append( ( int ) ( ( Point )nebrTemp[2] ).getX() + ":" );
                sb.append( ( int ) ( ( Point )nebrTemp[2] ).getY() + ":"+"@" );
            }
        }
        reHelloPacket.setData( sb.toString() );
        return reHelloPacket;
    }

    //判断发送HELLO的节点是否成为了Master
    private boolean hasBecameMaster( MddbPacket mp ) {
        long senderMasterId = Long.parseLong( mp.getData() );
        if( senderMasterId == mp.getSrcId() ) {
            return true;
        }
        return false;
    }

    //判断发送HELLO的节点是否超出有效范围
    private boolean overValidRang( int distance, MddbPacket packet ) {
        if( distance == ParentNode.ONE_HOP_DISTANCE ) {
            return true;
        }
        if( distance == ParentNode.ANY_DISTANCE ) {
            if( srcNode.getDistance( srcNode.ID, packet.getSrcId() ) <=
                srcNode.validRange ) {
                return true;
            }
            else {
                return false;
            }
        }
        if( distance > srcNode.validRange ) {
            return true;
        }
        return false;
    }

    //判断HELLO包的发送者是否是自己的成员
    private boolean isSelfMember( long senderId ) {
        synchronized( srcNode.mbrList ){
            if( srcNode.mbrList.contains( new Long( senderId ) ) ) {
                return true;
            }
            return false;
        }
    }

    //============================================================================
    //将收到的包提炼成MddbPacket--错误返回null----------------------------------------
    private MddbPacket extractFrameToPacket( StringTokenizer st ) {
        MddbPacket packet = new MddbPacket();
        String sTemp;
        ArrayList aTemp;

        synchronized( this ) {
            try {
                packet.setSrcAddr( getPoint( st.nextToken() ) ); //得到SrcNodeAddr
                packet.setSrcId( Long.parseLong( st.nextToken() ) ); //得到发送节点的ID
                packet.setDestAddr( getPoint( st.nextToken() ) ); //得到DestNodeAddr
                packet.setPathLength( Integer.parseInt( st.nextToken() ) ); //得到路径长度
                //提取路由表信息
                aTemp = new ArrayList();
                sTemp = st.nextToken();
                while( !sTemp.equals( "EndOfList" ) ) {
                    aTemp.add( getPoint( sTemp ) );
                    sTemp = st.nextToken();
                }
                packet.setRoutineList( aTemp );
                //提取类型信息
                packet.setType( Integer.parseInt( st.nextToken() ) );
                //获得时间戳
                packet.setTimeStamp( Long.parseLong( st.nextToken() ) );
                if( !st.nextToken().equals( "EndOfHeader" ) ) { //跳过包头结束标志
                    return null;
                }
                //取得数据--跳过结尾标志“EndOfData”
                StringBuffer sb = new StringBuffer();
                sTemp = st.nextToken();
                while( !sTemp.equals( "EndOfData" ) ) {
                    sb.append( sTemp + "@" );
                    sTemp = st.nextToken();
                }
                String ss = sb.toString();
                if( !ss.equals( "" ) ) {
                    ss = ss.substring( 0, ss.lastIndexOf( "@" ) );
                }
                packet.setData( ss );
            }
            catch( Exception e ) {
                e.printStackTrace();
                return null;
            }
        }
        //清理
        sTemp = null;
        aTemp = null;
        return packet;
    }

    //从发送的字符串中分析出节点位置
    private Point getPoint( String s ) {
        int x, y;
        StringTokenizer st = new StringTokenizer( s, ":" );
        x = Integer.parseInt( st.nextToken() );
        y = Integer.parseInt( st.nextToken() );
        return new Point( x, y );
    }

    //----------------------------------------------------------------------------
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -