📄 packetreceiver.java
字号:
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 + -