package com.limegroup.gnutella;
import com.limegroup.gnutella.messages.PingRequest;
import com.limegroup.gnutella.settings.PingPongSettings;
/**
* This class continually sends broadcast pings on behalf of an Ultrapeer
* to update the host caches of both itself and its leaves. This class
* reduces overall ping and pong traffic because it allows us not to forward
* pings received from other hosts. Instead, we use pong caching to respond
* to those pings with cached pongs, and send pings periodically in this
* class to obtain fresh host data.
*/
public final class Pinger implements Runnable {
/**
* Single <tt>Pinger</tt> instance, following the singleton pattern.
*/
private static final Pinger INSTANCE = new Pinger();
/**
* Constant for the number of milliseconds to wait between ping
* broadcasts. Public to make testing easier.
*/
public static final int PING_INTERVAL = 3000;
/**
* Returns the single <tt>Pinger</tt> instance.
*/
public static Pinger instance() {
return INSTANCE;
}
/**
* Private constructor to avoid this class being constructed multiple
* times, following the singleton pattern.
*/
private Pinger() {}
/**
* Starts the thread that continually sends broadcast pings on behalf of
* this node if it's an Ultrapeer.
*/
public void start() {
RouterService.schedule(this, PING_INTERVAL, PING_INTERVAL);
}
/**
* Broadcasts a ping to all connections.
*/
public void run() {
if(RouterService.isSupernode() &&
PingPongSettings.PINGS_ACTIVE.getValue()) {
RouterService.getMessageRouter().
broadcastPingRequest(new PingRequest((byte)3));
}
}
}