先看一下超类ActiveRouter。
ActiveRouter类:
该类是一个抽象类,是MessageRouter的子类。
数据域:
static final String DELETE_DELEVERED_S:表示如果设置为true,最终目的节点如果已经收到该message将拒收,那么发送节点将该message删除。
boolean deleteDelivered
static final String RESPONSE_PREFIX:所有回应message的前缀“R_”
static int ttlCheckInterval = 60:多久检查一次ttl(丢弃oldmessage)
ArrayList<Connection> sendingConnections:目前用于发送的连接
double lastTtlCheck
MessageTransferAcceptPolicy policy
EnergyModel energy
函数域:
构造函数ActiveRouter(Settings s)由配置文件创建ActiveRouter对象。
void init(DTNHost host, List<MessageListener> mListeners)初始化除了超类MessageRouter的初始化过程,新建一个ArrayList<Connction>(1)赋给sendingConnection,将lastTtlCheck设置为0。
void changedConnection(Connection con)
boolean requestDeliverableMessages(Connection con)
checkReceiving(Message m, DTNHost from)检查路由是否“想要”开始接收message。TRY_LATER_BUSY正在传送,DENIED_OLD已经携带该message,或者已经作为目的接收,DEINIED_NO_SPACE缓存没有空间。
boolean makeRoomForMessage(int size)按照最旧先出的顺序从缓存中移除message,直到有足够的空间给新的message。参数表示新message的大小。
void dropExpiredMessages()丢弃TTL小于0的message。
Message getNextMessageToRemove(boolean excludeMsgBeingSent)返回由接收时间决定的在缓存中的最旧的message。
List<Tuple<Message, Connection>> getMessageForConnected()返回一个列表,表中元素为Message和Connection组成的元组,表示这些Message的接受者是目前正与之相连的节点。
Tuple<Message, Connection> tryMessageForConnected(List<Tuple<Message, Connection>> tuples)尝试向元组列表中对应的connections发送messages,直到找到一组可以发送并返回该组,若没有返回null。
Message tryAllMessages(Connection con, List<Message> messages)将参数Message列表中的messages通过con发送,返回被从接受的message。
Connection tryMessagesToConnections(List<Message> messages, List<Connection> connections)尝试发送Message列表中的所有Message给Connection列表中的所有connection。一旦找到一个connection可以发送,随即返回该connection。
Connection tryAllMessagesToAllConnections()尝试发送该router携带的所有messages给所有的这个节点的所有connections。
Connection exchangeDeliverableMessages()在节点之间交换可转发的messages。首先,所有本节点messages要被检查,所有其他节点要向这个节点索要messages。如果传递开始,搜索结束。
void shuffleMessages(List<Message> messages)打乱messages列表的顺序。
boolean isTransferring()如果正在传递或者传递未完成,将返回true。
boolean isSending(String msgId)如果正在发送一个message,返回true。
void update()检查所有connections是否完成准备好的发送,并且丢弃掉连接关闭的,丢弃掉TTL小于0的message。(理论上可以有很多个发送connections,但现在所有的routers只能支持一个发送connection。)
遍历sendingConnections中所有元素如果message传递完成(isTransferred),如果connection中的message没有被丢弃,那么调用transferDone(Connection)(子类中可以重写这个函数)和finalizeTransfer()(用于完成目前被传递的message的传递,调用这个函数之后,这个message在这个connection中就查询不到了)完成本次传递。如果connection关闭,移除这个connection。如果发送后message依然把持缓存,将其释放,最后将满足移除条件的connection从sendingConnections中移除,若不满足条件,继续遍历下一个connection。
如果到了检查TTL的时间,丢弃过期的messages。最后触发energy.update。