package network; import java.util.List; import java.util.logging.Logger; import network.message.Message; import network.message.MessageFactory; import network.message.PeersMessage; import settings.Settings; public class ConnectionCreator extends Thread { private ConnectionCallback callback; public ConnectionCreator(ConnectionCallback callback) { this.callback = callback; } public void run() { try { while(true) { //CHECK IF WE NEED NEW CONNECTIONS if(Settings.getInstance().getMinConnections() >= callback.getActiveConnections().size()) { //GET LIST OF KNOWN PEERS List<Peer> knownPeers = PeerManager.getInstance().getKnownPeers(); //ITERATE knownPeers for(Peer peer: knownPeers) { //CHECK IF WE ALREADY HAVE MAX CONNECTIONS if(Settings.getInstance().getMaxConnections() > callback.getActiveConnections().size()) { //CHECK IF ALREADY CONNECTED TO PEER if(!callback.isConnectedTo(peer.getAddress())) { //CHECK IF SOCKET IS NOT LOCALHOST if(true) //if(!peer.getAddress().isSiteLocalAddress() && !peer.getAddress().isLoopbackAddress() && !peer.getAddress().isAnyLocalAddress()) { //CONNECT Logger.getGlobal().info("Connecting to peer : " + peer.getAddress()); peer.connect(callback); } } } } } //CHECK IF WE STILL NEED NEW CONNECTIONS if(Settings.getInstance().getMinConnections() >= callback.getActiveConnections().size()) { //OLD SCHOOL ITERATE activeConnections //avoids Exception when adding new elements for(int i=0; i<callback.getActiveConnections().size(); i++) { Peer peer = callback.getActiveConnections().get(i); //CHECK IF WE ALREADY HAVE MAX CONNECTIONS if(Settings.getInstance().getMaxConnections() > callback.getActiveConnections().size()) { //ASK PEER FOR PEERS Message getPeersMessage = MessageFactory.getInstance().createGetPeersMessage(); PeersMessage peersMessage = (PeersMessage) peer.getResponse(getPeersMessage); if(peersMessage != null) { //FOR ALL THE RECEIVED PEERS for(Peer newPeer: peersMessage.getPeers()) { //CHECK IF WE ALREADY HAVE MAX CONNECTIONS if(Settings.getInstance().getMaxConnections() > callback.getActiveConnections().size()) { //CHECK IF THAT PEER IS NOT BLACKLISTED if(!PeerManager.getInstance().isBlacklisted(newPeer)) { //CHECK IF CONNECTED if(!callback.isConnectedTo(newPeer)) { //CHECK IF SOCKET IS NOT LOCALHOST if(!newPeer.getAddress().isSiteLocalAddress() && !newPeer.getAddress().isLoopbackAddress() && !newPeer.getAddress().isAnyLocalAddress()) { Logger.getGlobal().info("Connecting to peer : " + newPeer.getAddress()); //CONNECT newPeer.connect(callback); } } } } } } } } } //SLEEP Thread.sleep(60 * 1000); } } catch(Exception e) { e.printStackTrace(); Logger.getGlobal().info("Error creating new connection"); } } }