mirror of
https://github.com/ChronosX88/KademliaDHT.git
synced 2024-11-22 10:12:19 +00:00
Still working on saving node state, the code is a huge mess right now
This commit is contained in:
parent
eb7d7b53a4
commit
d31f0e337f
@ -1,7 +1,9 @@
|
|||||||
package kademlia.core;
|
package kademlia.core;
|
||||||
|
|
||||||
|
import java.io.DataInputStream;
|
||||||
import java.io.DataOutputStream;
|
import java.io.DataOutputStream;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@ -70,12 +72,12 @@ public class Kademlia
|
|||||||
* from disk <i>or</i> a network error occurred while
|
* from disk <i>or</i> a network error occurred while
|
||||||
* attempting to connect to the network
|
* attempting to connect to the network
|
||||||
* */
|
* */
|
||||||
public Kademlia(String ownerId, Node localNode, int udpPort) throws IOException
|
public Kademlia(String ownerId, Node localNode, int udpPort, DHT dht) throws IOException
|
||||||
{
|
{
|
||||||
this.ownerId = ownerId;
|
this.ownerId = ownerId;
|
||||||
this.udpPort = udpPort;
|
this.udpPort = udpPort;
|
||||||
this.localNode = localNode;
|
this.localNode = localNode;
|
||||||
this.dht = new DHT();
|
this.dht = dht;
|
||||||
this.messageFactory = new MessageFactory(localNode, this.dht);
|
this.messageFactory = new MessageFactory(localNode, this.dht);
|
||||||
this.server = new KadServer(udpPort, this.messageFactory, this.localNode);
|
this.server = new KadServer(udpPort, this.messageFactory, this.localNode);
|
||||||
this.timer = new Timer(true);
|
this.timer = new Timer(true);
|
||||||
@ -105,18 +107,36 @@ public class Kademlia
|
|||||||
|
|
||||||
public Kademlia(String ownerId, NodeId defaultId, int udpPort) throws IOException
|
public Kademlia(String ownerId, NodeId defaultId, int udpPort) throws IOException
|
||||||
{
|
{
|
||||||
this(ownerId, new Node(defaultId, InetAddress.getLocalHost(), udpPort), udpPort);
|
this(ownerId, new Node(defaultId, InetAddress.getLocalHost(), udpPort), udpPort, new DHT());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Load Stored state
|
||||||
|
*
|
||||||
|
* @param ownerId The ID of the owner for the stored state
|
||||||
|
*
|
||||||
* @return A Kademlia instance loaded from a stored state in a file
|
* @return A Kademlia instance loaded from a stored state in a file
|
||||||
*
|
*
|
||||||
|
* @throws java.io.FileNotFoundException
|
||||||
|
*
|
||||||
* @todo Boot up this Kademlia instance from a saved file state
|
* @todo Boot up this Kademlia instance from a saved file state
|
||||||
*/
|
*/
|
||||||
// public Kademlia loadFromFile(String ownerId)
|
public static void loadFromFile(String ownerId) throws FileNotFoundException, IOException, ClassNotFoundException
|
||||||
// {
|
{
|
||||||
//
|
/* Setup the file in which we store the state */
|
||||||
// }
|
DataInputStream din = new DataInputStream(new FileInputStream(getStateStorageFolderName() + File.separator + ownerId + ".kns"));
|
||||||
|
|
||||||
|
/* Read the UDP Port that this app is running on */
|
||||||
|
Integer rPort = new JsonSerializer<Integer>().read(din);
|
||||||
|
|
||||||
|
/* Read the node state */
|
||||||
|
// Node rN = new JsonSerializer<Node>().read(din);
|
||||||
|
|
||||||
|
/* Read the DHT */
|
||||||
|
DHT rDht = new JsonSerializer<DHT>().read(din);
|
||||||
|
|
||||||
|
//return new Kademlia(ownerId, rN, rPort, rDht);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return Node The local node for this system
|
* @return Node The local node for this system
|
||||||
@ -225,8 +245,11 @@ public class Kademlia
|
|||||||
*
|
*
|
||||||
* @throws java.io.FileNotFoundException
|
* @throws java.io.FileNotFoundException
|
||||||
*/
|
*/
|
||||||
public void shutdown() throws FileNotFoundException, IOException
|
public void shutdown() throws FileNotFoundException, IOException, ClassNotFoundException
|
||||||
{
|
{
|
||||||
|
/* Shut down the server */
|
||||||
|
this.server.shutdown();
|
||||||
|
|
||||||
/* Save this Kademlia instance's state if required */
|
/* Save this Kademlia instance's state if required */
|
||||||
if (Configuration.SAVE_STATE_ON_SHUTDOWN)
|
if (Configuration.SAVE_STATE_ON_SHUTDOWN)
|
||||||
{
|
{
|
||||||
@ -235,8 +258,6 @@ public class Kademlia
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Shut down the server */
|
|
||||||
this.server.shutdown();
|
|
||||||
|
|
||||||
/* Now we store the content locally in a file */
|
/* Now we store the content locally in a file */
|
||||||
}
|
}
|
||||||
@ -246,19 +267,35 @@ public class Kademlia
|
|||||||
*
|
*
|
||||||
* @throws java.io.FileNotFoundException
|
* @throws java.io.FileNotFoundException
|
||||||
*/
|
*/
|
||||||
private void saveKadState() throws FileNotFoundException, IOException
|
private void saveKadState() throws FileNotFoundException, IOException, ClassNotFoundException
|
||||||
{
|
{
|
||||||
/* Setup the file in which we store the state */
|
/* Setup the file in which we store the state */
|
||||||
DataOutputStream dout = new DataOutputStream(new FileOutputStream(this.getStateStorageFolderName() + File.separator + this.ownerId + ".kns"));
|
DataOutputStream dout;
|
||||||
|
dout = new DataOutputStream(new FileOutputStream(getStateStorageFolderName() + File.separator + this.ownerId + ".kns"));
|
||||||
|
|
||||||
|
System.out.println("Saving state");
|
||||||
/* Save the UDP Port that this app is running on */
|
/* Save the UDP Port that this app is running on */
|
||||||
new JsonSerializer<Integer>().write(this.udpPort, dout);
|
new JsonSerializer<Integer>().write(this.udpPort, dout);
|
||||||
|
|
||||||
/* Save the node state */
|
/* Save the node state */
|
||||||
|
dout = new DataOutputStream(new FileOutputStream(getStateStorageFolderName() + File.separator + this.ownerId + ".kns"));
|
||||||
new JsonSerializer<Node>().write(this.localNode, dout);
|
new JsonSerializer<Node>().write(this.localNode, dout);
|
||||||
|
|
||||||
/* Save the DHT */
|
/* Save the DHT */
|
||||||
new JsonSerializer<DHT>().write(this.dht, dout);
|
// dout = new DataOutputStream(new FileOutputStream(getStateStorageFolderName() + File.separator + this.ownerId + ".kns"));
|
||||||
|
//new JsonSerializer<DHT>().write(this.dht, dout);
|
||||||
|
|
||||||
|
// System.out.println(dht.getStorageEntries());
|
||||||
|
//
|
||||||
|
// DataInputStream din = new DataInputStream(new FileInputStream(getStateStorageFolderName() + File.separator + ownerId + ".kns"));
|
||||||
|
// DHT dddht = new JsonSerializer<DHT>().read(din);
|
||||||
|
// System.out.println();
|
||||||
|
// System.out.println();
|
||||||
|
// System.out.println();
|
||||||
|
// System.out.println();
|
||||||
|
// System.out.println(dddht);
|
||||||
|
System.out.println("FInished saving state");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -266,7 +303,7 @@ public class Kademlia
|
|||||||
*
|
*
|
||||||
* @return String The name of the folder to store node states
|
* @return String The name of the folder to store node states
|
||||||
*/
|
*/
|
||||||
private String getStateStorageFolderName()
|
private static String getStateStorageFolderName()
|
||||||
{
|
{
|
||||||
String storagePath = System.getProperty("user.home") + File.separator + Configuration.LOCAL_FOLDER;
|
String storagePath = System.getProperty("user.home") + File.separator + Configuration.LOCAL_FOLDER;
|
||||||
File mainStorageFolder = new File(storagePath);
|
File mainStorageFolder = new File(storagePath);
|
||||||
@ -287,4 +324,31 @@ public class Kademlia
|
|||||||
|
|
||||||
return mainStorageFolder + File.separator + "nodes";
|
return mainStorageFolder + File.separator + "nodes";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a string containing all data about this Kademlia instance
|
||||||
|
*
|
||||||
|
* @return The string representation of this Kad instance
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
StringBuilder sb = new StringBuilder("\n\nPrinting Kad State for instance with owner: ");
|
||||||
|
sb.append(this.ownerId);
|
||||||
|
sb.append("\n\n");
|
||||||
|
|
||||||
|
sb.append("\n");
|
||||||
|
sb.append("Local Node");
|
||||||
|
sb.append(this.localNode);
|
||||||
|
sb.append("\n");
|
||||||
|
|
||||||
|
sb.append("\n");
|
||||||
|
sb.append("Routing Table: ");
|
||||||
|
sb.append(this.localNode.getRoutingTable());
|
||||||
|
sb.append("\n");
|
||||||
|
|
||||||
|
sb.append("\n\n\n");
|
||||||
|
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -24,7 +24,7 @@ public class DHT
|
|||||||
{
|
{
|
||||||
|
|
||||||
private final StorageEntryManager entriesManager;
|
private final StorageEntryManager entriesManager;
|
||||||
private final JsonSerializer<KadContent> contentSerializer;
|
private transient final JsonSerializer<KadContent> contentSerializer;
|
||||||
|
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -24,7 +24,7 @@ public class Node implements Streamable
|
|||||||
private InetAddress inetAddress;
|
private InetAddress inetAddress;
|
||||||
private int port;
|
private int port;
|
||||||
|
|
||||||
private final RoutingTable routingTable;
|
private transient final RoutingTable routingTable;
|
||||||
|
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -1,14 +1,15 @@
|
|||||||
/**
|
|
||||||
* @author Joshua Kissoon
|
|
||||||
* @created 20140219
|
|
||||||
* @desc Testing connecting 2 nodes
|
|
||||||
*/
|
|
||||||
package kademlia.tests;
|
package kademlia.tests;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import kademlia.core.Kademlia;
|
import kademlia.core.Kademlia;
|
||||||
import kademlia.node.NodeId;
|
import kademlia.node.NodeId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Testing connecting 2 nodes
|
||||||
|
*
|
||||||
|
* @author Joshua Kissoon
|
||||||
|
* @created 20140219
|
||||||
|
*/
|
||||||
public class NodeConnectionTest
|
public class NodeConnectionTest
|
||||||
{
|
{
|
||||||
|
|
||||||
|
43
src/kademlia/tests/SaveStateTest.java
Normal file
43
src/kademlia/tests/SaveStateTest.java
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
package kademlia.tests;
|
||||||
|
|
||||||
|
import kademlia.core.Kademlia;
|
||||||
|
import kademlia.node.NodeId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Testing the save and retrieve state operations
|
||||||
|
*
|
||||||
|
* @author Joshua Kissoon
|
||||||
|
* @since 20140309
|
||||||
|
*/
|
||||||
|
public class SaveStateTest
|
||||||
|
{
|
||||||
|
|
||||||
|
public static void main(String[] args)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
/* Setting up 2 Kad networks */
|
||||||
|
Kademlia kad1 = new Kademlia("JoshuaK", new NodeId("ASF45678947584567467"), 7574);
|
||||||
|
Kademlia kad2 = new Kademlia("Crystal", new NodeId("ASERTKJDHGVHERJHGFLK"), 7572);
|
||||||
|
|
||||||
|
/* Connecting 2 to 1 */
|
||||||
|
System.out.println("Connecting Kad 1 and Kad 2");
|
||||||
|
kad1.connect(kad2.getNode());
|
||||||
|
|
||||||
|
System.out.println(kad1);
|
||||||
|
System.out.println(kad2);
|
||||||
|
|
||||||
|
/* Shutting down kad1 and restarting it */
|
||||||
|
System.out.println("\n\n\nShutting down Kad instance");
|
||||||
|
kad1.shutdown();
|
||||||
|
|
||||||
|
//System.out.println("\n\n\nReloading down Kad instance from file");
|
||||||
|
//Kademlia.loadFromFile("JoshuaK");
|
||||||
|
//System.out.println(kad3);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user