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

📄 clientnode.java

📁 java B++树 一个很好的算法来实现这些问题 推荐!
💻 JAVA
字号:
package mddb.client;

import java.util.*;
import java.net.*;
import mddb.packets.MddbPacket;
import java.io.IOException;
import java.awt.Point;
import mddb.client.components.*;
/*------------------------------------------------------------------------------
 用于描述客户端节点
 ------------------------------------------------------------------------------*/
public class ClientNode
    extends ParentNode {
    NodeTimer nodeTimer; //节点全部计时器的封装
    NetPacketProcessor npkgProcessor; //网络包处理器
    PacketReceiver pkgReceiver; //包接收器
    PacketSender pkgSender; //包发送器
    RoutineProcessor routProcessor; //路由处理器

    Properties locationSetting;

    //接口部分===================================================================
    public ClientNode( int rang, int validRang, Point nodePosition,long id ,
                       Properties timerSetting,Properties locSetting) {
        super( rang, validRang, nodePosition ,id);
        //保留属性
        nodeTimer = new NodeTimer(timerSetting,this);
        locationSetting = locSetting;
        //初始化节点部件
        try {
            pkgReceiver = new PacketReceiver( this );
        }
        catch( SocketException socketE ) {
            System.out.println( "节点:" + ID + " 包接收器初始化失败!" );
            socketE.printStackTrace();
        }
        pkgSender = new PacketSender();
        routProcessor = new RoutineProcessor();
    }
    //更新节点位置
    public void updateLocalPosition()
    {
        String pos;
        synchronized(this) {
            pos = this.locationSetting.getProperty( String.valueOf( ID ) );
            int x = Integer.parseInt( pos.substring( 0, pos.indexOf( ":" ) ) );
            int y = Integer.parseInt( pos.substring( pos.indexOf( ":" ) + 1 ) );
            this.position = new Point( x, y );
        }
    }

    //获得与指定id的节点的距离
   int getDistance(long localId,long otherId){
        Point local = getLocation(localId);
        Point other = getLocation(otherId);
        int x1 = (int)local.getX(),y1 = (int)local.getY();
        int x2 = (int)other.getX(),y2 = (int)other.getY();
        return (int)Math.sqrt( (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
    }

    //获得给定ID的位置
    Point getLocation(long id)
    {
        StringTokenizer st = new StringTokenizer(this.locationSetting.getProperty(String.valueOf(id)),":");
        int x = Integer.parseInt( st.nextToken());
        int y = Integer.parseInt(st.nextToken());
        return new Point(x,y);
    }

    //私有部分===================================================================
    //初始化失败返回false,否则返回true
    public synchronized boolean init( ) {
        //step1:	节点初始化自己的标识和Rang等信息(range已给定)
        //第一步由于某些属性已经指定故忽略
        //step2:	启动接收线程ReceiveThread,接收其它节点发来的包
        pkgReceiver.start();
        //step3:	令自己是孤点
        mkAcnode();
        //step4:	启动移动定时器MoveTimer--在修改后的算法中不需要了
        //nodeTimer.startMoveTimer();
        //step5:	启动位置更新定时器UpdatePositionTimer;
        nodeTimer.startUpdatePositionTimer();
        //step6:	定时器DelayTimer启动;
        nodeTimer.startDelayTimer();
        //step7:	节点时间戳TimeStamp=当前时间;
        timeStamp = System.currentTimeMillis();
        //step8:	节点状态=HELLO_STATUS;
        nodeState = ParentNode.HELLO_STATUS;
        //step9:	广播NET_HELLO包
        //注意:如果地址是Point(-1,-1),则代表广播地址
        try {
            ArrayList temp = new ArrayList();
            temp.add( position ); //包的起始地址
            temp.add( new Point( -1, -1 ) ); //包的终止地址
            MddbPacket mp = new MddbPacket( new Point( position ),
                                            ID,
                                            new Point( -1, -1 ),
                                            ANY_DISTANCE,
                                            temp,
                                            MddbPacket.NET_HELLO );
            mp.setData( String.valueOf( masterId ) ); //必须要先进行SetData才行
            pkgSender.sendNetPacket( mp, MddbPacket.FRAME_GROUP_PKG );
        }
        catch( IOException ioe ) {
            ioe.printStackTrace();
            return false;
        }
        //step10:	启动广播定时器HelloBroadcastTimer;
        nodeTimer.startHelloBroadcastTimer();

        return true;
    }

    //另自己成为孤点:当某组有且仅有一个节点时,即该组只含master节点时,该master节点称为孤点。
    protected synchronized void mkAcnode() {
        masterId = ID; //节点刚出现时是孤点,所以自己是自己的Master
        //邻接表中只剩下自己
        nebrList.clear();
        nebrList.add(this.ID,this.masterId,this.position);
        //成员列表为空
        mbrList.clear();
        mbrList.add(this.ID,this.position);
        //组邻接表为空
        groupAdjacencyList.clear();
    }

}

⌨️ 快捷键说明

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