📄 clientnode.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 + -