mirror of
https://github.com/ChronosX88/KademliaDHT.git
synced 2024-12-22 15:51:46 +00:00
Added a KademliaDHT Interface and setup the DHT class and the rest of the system to use this interface
This commit is contained in:
parent
568f2fe9a8
commit
9fb139571a
@ -14,6 +14,7 @@ import java.util.TimerTask;
|
||||
import kademlia.dht.GetParameter;
|
||||
import kademlia.dht.DHT;
|
||||
import kademlia.dht.KadContent;
|
||||
import kademlia.dht.KademliaDHT;
|
||||
import kademlia.dht.StorageEntry;
|
||||
import kademlia.exceptions.ContentNotFoundException;
|
||||
import kademlia.exceptions.RoutingException;
|
||||
@ -50,7 +51,7 @@ public class JKademliaNode implements KademliaNode
|
||||
/* Objects to be used */
|
||||
private final transient Node localNode;
|
||||
private final transient KadServer server;
|
||||
private final transient DHT dht;
|
||||
private final transient KademliaDHT dht;
|
||||
private transient KademliaRoutingTable routingTable;
|
||||
private final int udpPort;
|
||||
private transient KadConfiguration config;
|
||||
@ -87,7 +88,7 @@ public class JKademliaNode implements KademliaNode
|
||||
* from disk <i>or</i> a network error occurred while
|
||||
* attempting to bootstrap to the network
|
||||
* */
|
||||
public JKademliaNode(String ownerId, Node localNode, int udpPort, DHT dht, KademliaRoutingTable routingTable, KadConfiguration config) throws IOException
|
||||
public JKademliaNode(String ownerId, Node localNode, int udpPort, KademliaDHT dht, KademliaRoutingTable routingTable, KadConfiguration config) throws IOException
|
||||
{
|
||||
this.ownerId = ownerId;
|
||||
this.udpPort = udpPort;
|
||||
@ -217,7 +218,7 @@ public class JKademliaNode implements KademliaNode
|
||||
* @section Read the DHT
|
||||
*/
|
||||
din = new DataInputStream(new FileInputStream(getStateStorageFolderName(ownerId, iconfig) + File.separator + "dht.kns"));
|
||||
DHT idht = new JsonDHTSerializer().read(din);
|
||||
KademliaDHT idht = new JsonDHTSerializer().read(din);
|
||||
idht.setConfiguration(iconfig);
|
||||
|
||||
return new JKademliaNode(ownerId, inode, ikad.getPort(), idht, irtbl, iconfig);
|
||||
@ -236,7 +237,7 @@ public class JKademliaNode implements KademliaNode
|
||||
}
|
||||
|
||||
@Override
|
||||
public DHT getDHT()
|
||||
public KademliaDHT getDHT()
|
||||
{
|
||||
return this.dht;
|
||||
}
|
||||
|
@ -3,8 +3,8 @@ package kademlia;
|
||||
import java.io.IOException;
|
||||
import java.util.NoSuchElementException;
|
||||
import kademlia.dht.GetParameter;
|
||||
import kademlia.dht.DHT;
|
||||
import kademlia.dht.KadContent;
|
||||
import kademlia.dht.KademliaDHT;
|
||||
import kademlia.dht.StorageEntry;
|
||||
import kademlia.exceptions.ContentNotFoundException;
|
||||
import kademlia.exceptions.RoutingException;
|
||||
@ -44,7 +44,7 @@ public interface KademliaNode
|
||||
/**
|
||||
* @return The DHT for this kad instance
|
||||
*/
|
||||
public DHT getDHT();
|
||||
public KademliaDHT getDHT();
|
||||
|
||||
/**
|
||||
* @return The current KadConfiguration object being used
|
||||
|
@ -22,7 +22,7 @@ import kademlia.util.serializer.KadSerializer;
|
||||
* @author Joshua Kissoon
|
||||
* @since 20140226
|
||||
*/
|
||||
public class DHT
|
||||
public class DHT implements KademliaDHT
|
||||
{
|
||||
|
||||
private transient StoredContentManager contentManager;
|
||||
@ -38,29 +38,19 @@ public class DHT
|
||||
this.initialize();
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize this DHT to it's default state
|
||||
*/
|
||||
@Override
|
||||
public final void initialize()
|
||||
{
|
||||
contentManager = new StoredContentManager();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a new configuration. Mainly used when we restore the DHT state from a file
|
||||
*
|
||||
* @param con The new configuration file
|
||||
*/
|
||||
@Override
|
||||
public void setConfiguration(KadConfiguration con)
|
||||
{
|
||||
this.config = con;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new Serializer or returns an existing serializer
|
||||
*
|
||||
* @return The new ContentSerializer
|
||||
*/
|
||||
@Override
|
||||
public KadSerializer<StorageEntry> getSerializer()
|
||||
{
|
||||
if (null == serializer)
|
||||
@ -71,15 +61,7 @@ public class DHT
|
||||
return serializer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle storing content locally
|
||||
*
|
||||
* @param content The DHT content to store
|
||||
*
|
||||
* @return boolean true if we stored the content, false if the content already exists and is up to date
|
||||
*
|
||||
* @throws java.io.IOException
|
||||
*/
|
||||
@Override
|
||||
public boolean store(StorageEntry content) throws IOException
|
||||
{
|
||||
/* Lets check if we have this content and it's the updated version */
|
||||
@ -141,47 +123,27 @@ public class DHT
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean store(KadContent content) throws IOException
|
||||
{
|
||||
return this.store(new StorageEntry(content));
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves a Content from local storage
|
||||
*
|
||||
* @param key The Key of the content to retrieve
|
||||
* @param hashCode The hash code of the content to retrieve
|
||||
*
|
||||
* @return A KadContent object
|
||||
*/
|
||||
private StorageEntry retrieve(KademliaId key, int hashCode) throws FileNotFoundException, IOException, ClassNotFoundException
|
||||
@Override
|
||||
public StorageEntry retrieve(KademliaId key, int hashCode) throws FileNotFoundException, IOException, ClassNotFoundException
|
||||
{
|
||||
String folder = this.getContentStorageFolderName(key);
|
||||
DataInputStream din = new DataInputStream(new FileInputStream(folder + File.separator + hashCode + ".kct"));
|
||||
return this.getSerializer().read(din);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if any content for the given criteria exists in this DHT
|
||||
*
|
||||
* @param param The content search criteria
|
||||
*
|
||||
* @return boolean Whether any content exist that satisfy the criteria
|
||||
*/
|
||||
@Override
|
||||
public boolean contains(GetParameter param)
|
||||
{
|
||||
return this.contentManager.contains(param);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve and create a KadContent object given the StorageEntry object
|
||||
*
|
||||
* @param entry The StorageEntry used to retrieve this content
|
||||
*
|
||||
* @return KadContent The content object
|
||||
*
|
||||
* @throws java.io.IOException
|
||||
*/
|
||||
@Override
|
||||
public StorageEntry get(StorageEntryMetadata entry) throws IOException, NoSuchElementException
|
||||
{
|
||||
try
|
||||
@ -201,16 +163,7 @@ public class DHT
|
||||
throw new NoSuchElementException();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the StorageEntry for the content if any exist,
|
||||
* retrieve the KadContent from the storage system and return it
|
||||
*
|
||||
* @param param The parameters used to filter the content needed
|
||||
*
|
||||
* @return KadContent A KadContent found on the DHT satisfying the given criteria
|
||||
*
|
||||
* @throws java.io.IOException
|
||||
*/
|
||||
@Override
|
||||
public StorageEntry get(GetParameter param) throws NoSuchElementException, IOException
|
||||
{
|
||||
/* Load a KadContent if any exist for the given criteria */
|
||||
@ -232,19 +185,13 @@ public class DHT
|
||||
throw new NoSuchElementException();
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete a content from local storage
|
||||
*
|
||||
* @param content The Content to Remove
|
||||
*
|
||||
*
|
||||
* @throws kademlia.exceptions.ContentNotFoundException
|
||||
*/
|
||||
@Override
|
||||
public void remove(KadContent content) throws ContentNotFoundException
|
||||
{
|
||||
this.remove(new StorageEntryMetadata(content));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void remove(StorageEntryMetadata entry) throws ContentNotFoundException
|
||||
{
|
||||
String folder = this.getContentStorageFolderName(entry.getKey());
|
||||
@ -288,20 +235,13 @@ public class DHT
|
||||
return contentStorageFolder.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return A List of all StorageEntries for this node
|
||||
*/
|
||||
@Override
|
||||
public List<StorageEntryMetadata> getStorageEntries()
|
||||
{
|
||||
return contentManager.getAllEntries();
|
||||
}
|
||||
|
||||
/**
|
||||
* Used to add a list of storage entries for existing content to the DHT.
|
||||
* Mainly used when retrieving StorageEntries from a saved state file.
|
||||
*
|
||||
* @param ientries The entries to add
|
||||
*/
|
||||
@Override
|
||||
public void putStorageEntries(List<StorageEntryMetadata> ientries)
|
||||
{
|
||||
for (StorageEntryMetadata e : ientries)
|
||||
|
122
src/kademlia/dht/KademliaDHT.java
Normal file
122
src/kademlia/dht/KademliaDHT.java
Normal file
@ -0,0 +1,122 @@
|
||||
package kademlia.dht;
|
||||
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
import java.util.NoSuchElementException;
|
||||
import kademlia.KadConfiguration;
|
||||
import kademlia.exceptions.ContentNotFoundException;
|
||||
import kademlia.node.KademliaId;
|
||||
import kademlia.util.serializer.KadSerializer;
|
||||
|
||||
/**
|
||||
* The main Distributed Hash Table interface that manages the entire DHT
|
||||
*
|
||||
* @author Joshua Kissoon
|
||||
* @since 20140523
|
||||
*/
|
||||
public interface KademliaDHT
|
||||
{
|
||||
|
||||
/**
|
||||
* Initialize this DHT to it's default state
|
||||
*/
|
||||
public void initialize();
|
||||
|
||||
/**
|
||||
* Set a new configuration. Mainly used when we restore the DHT state from a file
|
||||
*
|
||||
* @param con The new configuration file
|
||||
*/
|
||||
public void setConfiguration(KadConfiguration con);
|
||||
|
||||
/**
|
||||
* Creates a new Serializer or returns an existing serializer
|
||||
*
|
||||
* @return The new ContentSerializer
|
||||
*/
|
||||
public KadSerializer<StorageEntry> getSerializer();
|
||||
|
||||
/**
|
||||
* Handle storing content locally
|
||||
*
|
||||
* @param content The DHT content to store
|
||||
*
|
||||
* @return boolean true if we stored the content, false if the content already exists and is up to date
|
||||
*
|
||||
* @throws java.io.IOException
|
||||
*/
|
||||
public boolean store(StorageEntry content) throws IOException;
|
||||
|
||||
public boolean store(KadContent content) throws IOException;
|
||||
|
||||
/**
|
||||
* Retrieves a Content from local storage
|
||||
*
|
||||
* @param key The Key of the content to retrieve
|
||||
* @param hashCode The hash code of the content to retrieve
|
||||
*
|
||||
* @return A KadContent object
|
||||
*
|
||||
* @throws java.io.FileNotFoundException
|
||||
* @throws java.lang.ClassNotFoundException
|
||||
*/
|
||||
public StorageEntry retrieve(KademliaId key, int hashCode) throws FileNotFoundException, IOException, ClassNotFoundException;
|
||||
|
||||
/**
|
||||
* Check if any content for the given criteria exists in this DHT
|
||||
*
|
||||
* @param param The content search criteria
|
||||
*
|
||||
* @return boolean Whether any content exist that satisfy the criteria
|
||||
*/
|
||||
public boolean contains(GetParameter param);
|
||||
|
||||
/**
|
||||
* Retrieve and create a KadContent object given the StorageEntry object
|
||||
*
|
||||
* @param entry The StorageEntry used to retrieve this content
|
||||
*
|
||||
* @return KadContent The content object
|
||||
*
|
||||
* @throws java.io.IOException
|
||||
*/
|
||||
public StorageEntry get(StorageEntryMetadata entry) throws IOException, NoSuchElementException;
|
||||
|
||||
/**
|
||||
* Get the StorageEntry for the content if any exist.
|
||||
*
|
||||
* @param param The parameters used to filter the content needed
|
||||
*
|
||||
* @return KadContent A KadContent found on the DHT satisfying the given criteria
|
||||
*
|
||||
* @throws java.io.IOException
|
||||
*/
|
||||
public StorageEntry get(GetParameter param) throws NoSuchElementException, IOException;
|
||||
|
||||
/**
|
||||
* Delete a content from local storage
|
||||
*
|
||||
* @param content The Content to Remove
|
||||
*
|
||||
*
|
||||
* @throws kademlia.exceptions.ContentNotFoundException
|
||||
*/
|
||||
public void remove(KadContent content) throws ContentNotFoundException;
|
||||
|
||||
public void remove(StorageEntryMetadata entry) throws ContentNotFoundException;
|
||||
|
||||
/**
|
||||
* @return A List of all StorageEntries for this node
|
||||
*/
|
||||
public List<StorageEntryMetadata> getStorageEntries();
|
||||
|
||||
/**
|
||||
* Used to add a list of storage entries for existing content to the DHT.
|
||||
* Mainly used when retrieving StorageEntries from a saved state file.
|
||||
*
|
||||
* @param ientries The entries to add
|
||||
*/
|
||||
public void putStorageEntries(List<StorageEntryMetadata> ientries);
|
||||
|
||||
}
|
@ -1,8 +1,8 @@
|
||||
package kademlia.message;
|
||||
|
||||
import java.io.IOException;
|
||||
import kademlia.JKademliaNode;
|
||||
import kademlia.KadServer;
|
||||
import kademlia.KademliaNode;
|
||||
|
||||
/**
|
||||
* Receives a ConnectMessage and sends an AcknowledgeMessage as reply.
|
||||
@ -14,9 +14,9 @@ public class ConnectReceiver implements Receiver
|
||||
{
|
||||
|
||||
private final KadServer server;
|
||||
private final JKademliaNode localNode;
|
||||
private final KademliaNode localNode;
|
||||
|
||||
public ConnectReceiver(KadServer server, JKademliaNode local)
|
||||
public ConnectReceiver(KadServer server, KademliaNode local)
|
||||
{
|
||||
this.server = server;
|
||||
this.localNode = local;
|
||||
|
@ -2,10 +2,10 @@ package kademlia.message;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.NoSuchElementException;
|
||||
import kademlia.JKademliaNode;
|
||||
import kademlia.KadConfiguration;
|
||||
import kademlia.KadServer;
|
||||
import kademlia.dht.DHT;
|
||||
import kademlia.KademliaNode;
|
||||
import kademlia.dht.KademliaDHT;
|
||||
|
||||
/**
|
||||
* Responds to a ContentLookupMessage by sending a ContentMessage containing the requested content;
|
||||
@ -18,11 +18,11 @@ public class ContentLookupReceiver implements Receiver
|
||||
{
|
||||
|
||||
private final KadServer server;
|
||||
private final JKademliaNode localNode;
|
||||
private final DHT dht;
|
||||
private final KademliaNode localNode;
|
||||
private final KademliaDHT dht;
|
||||
private final KadConfiguration config;
|
||||
|
||||
public ContentLookupReceiver(KadServer server, JKademliaNode localNode, DHT dht, KadConfiguration config)
|
||||
public ContentLookupReceiver(KadServer server, KademliaNode localNode, KademliaDHT dht, KadConfiguration config)
|
||||
{
|
||||
this.server = server;
|
||||
this.localNode = localNode;
|
||||
|
@ -2,10 +2,10 @@ package kademlia.message;
|
||||
|
||||
import java.io.DataInputStream;
|
||||
import java.io.IOException;
|
||||
import kademlia.JKademliaNode;
|
||||
import kademlia.KadConfiguration;
|
||||
import kademlia.KadServer;
|
||||
import kademlia.dht.DHT;
|
||||
import kademlia.KademliaNode;
|
||||
import kademlia.dht.KademliaDHT;
|
||||
|
||||
/**
|
||||
* Handles creating messages and receivers
|
||||
@ -16,11 +16,11 @@ import kademlia.dht.DHT;
|
||||
public class MessageFactory implements KademliaMessageFactory
|
||||
{
|
||||
|
||||
private final JKademliaNode localNode;
|
||||
private final DHT dht;
|
||||
private final KademliaNode localNode;
|
||||
private final KademliaDHT dht;
|
||||
private final KadConfiguration config;
|
||||
|
||||
public MessageFactory(JKademliaNode local, DHT dht, KadConfiguration config)
|
||||
public MessageFactory(KademliaNode local, KademliaDHT dht, KadConfiguration config)
|
||||
{
|
||||
this.localNode = local;
|
||||
this.dht = dht;
|
||||
|
@ -2,9 +2,9 @@ package kademlia.message;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
import kademlia.JKademliaNode;
|
||||
import kademlia.KadConfiguration;
|
||||
import kademlia.KadServer;
|
||||
import kademlia.KademliaNode;
|
||||
import kademlia.node.Node;
|
||||
|
||||
/**
|
||||
@ -17,10 +17,10 @@ public class NodeLookupReceiver implements Receiver
|
||||
{
|
||||
|
||||
private final KadServer server;
|
||||
private final JKademliaNode localNode;
|
||||
private final KademliaNode localNode;
|
||||
private final KadConfiguration config;
|
||||
|
||||
public NodeLookupReceiver(KadServer server, JKademliaNode local, KadConfiguration config)
|
||||
public NodeLookupReceiver(KadServer server, KademliaNode local, KadConfiguration config)
|
||||
{
|
||||
this.server = server;
|
||||
this.localNode = local;
|
||||
|
@ -1,9 +1,9 @@
|
||||
package kademlia.message;
|
||||
|
||||
import java.io.IOException;
|
||||
import kademlia.JKademliaNode;
|
||||
import kademlia.KadServer;
|
||||
import kademlia.dht.DHT;
|
||||
import kademlia.KademliaNode;
|
||||
import kademlia.dht.KademliaDHT;
|
||||
|
||||
/**
|
||||
* Receiver for incoming StoreContentMessage
|
||||
@ -15,10 +15,10 @@ public class StoreContentReceiver implements Receiver
|
||||
{
|
||||
|
||||
private final KadServer server;
|
||||
private final JKademliaNode localNode;
|
||||
private final DHT dht;
|
||||
private final KademliaNode localNode;
|
||||
private final KademliaDHT dht;
|
||||
|
||||
public StoreContentReceiver(KadServer server, JKademliaNode localNode, DHT dht)
|
||||
public StoreContentReceiver(KadServer server, KademliaNode localNode, KademliaDHT dht)
|
||||
{
|
||||
this.server = server;
|
||||
this.localNode = localNode;
|
||||
|
@ -5,7 +5,7 @@ import java.util.List;
|
||||
import kademlia.JKademliaNode;
|
||||
import kademlia.KadConfiguration;
|
||||
import kademlia.KadServer;
|
||||
import kademlia.dht.DHT;
|
||||
import kademlia.dht.KademliaDHT;
|
||||
import kademlia.dht.StorageEntryMetadata;
|
||||
import kademlia.exceptions.ContentNotFoundException;
|
||||
import kademlia.message.Message;
|
||||
@ -23,10 +23,10 @@ public class ContentRefreshOperation implements Operation
|
||||
|
||||
private final KadServer server;
|
||||
private final JKademliaNode localNode;
|
||||
private final DHT dht;
|
||||
private final KademliaDHT dht;
|
||||
private final KadConfiguration config;
|
||||
|
||||
public ContentRefreshOperation(KadServer server, JKademliaNode localNode, DHT dht, KadConfiguration config)
|
||||
public ContentRefreshOperation(KadServer server, JKademliaNode localNode, KademliaDHT dht, KadConfiguration config)
|
||||
{
|
||||
this.server = server;
|
||||
this.localNode = localNode;
|
||||
|
@ -4,7 +4,7 @@ import java.io.IOException;
|
||||
import kademlia.JKademliaNode;
|
||||
import kademlia.KadConfiguration;
|
||||
import kademlia.KadServer;
|
||||
import kademlia.dht.DHT;
|
||||
import kademlia.dht.KademliaDHT;
|
||||
|
||||
/**
|
||||
* An operation that handles refreshing the entire Kademlia Systems including buckets and content
|
||||
@ -17,10 +17,10 @@ public class KadRefreshOperation implements Operation
|
||||
|
||||
private final KadServer server;
|
||||
private final JKademliaNode localNode;
|
||||
private final DHT dht;
|
||||
private final KademliaDHT dht;
|
||||
private final KadConfiguration config;
|
||||
|
||||
public KadRefreshOperation(KadServer server, JKademliaNode localNode, DHT dht, KadConfiguration config)
|
||||
public KadRefreshOperation(KadServer server, JKademliaNode localNode, KademliaDHT dht, KadConfiguration config)
|
||||
{
|
||||
this.server = server;
|
||||
this.localNode = localNode;
|
||||
|
@ -5,8 +5,7 @@ import java.util.List;
|
||||
import kademlia.JKademliaNode;
|
||||
import kademlia.KadConfiguration;
|
||||
import kademlia.KadServer;
|
||||
import kademlia.dht.DHT;
|
||||
import kademlia.dht.KadContent;
|
||||
import kademlia.dht.KademliaDHT;
|
||||
import kademlia.dht.StorageEntry;
|
||||
import kademlia.message.Message;
|
||||
import kademlia.message.StoreContentMessage;
|
||||
@ -24,7 +23,7 @@ public class StoreOperation implements Operation
|
||||
private final KadServer server;
|
||||
private final JKademliaNode localNode;
|
||||
private final StorageEntry storageEntry;
|
||||
private final DHT localDht;
|
||||
private final KademliaDHT localDht;
|
||||
private final KadConfiguration config;
|
||||
|
||||
/**
|
||||
@ -34,7 +33,7 @@ public class StoreOperation implements Operation
|
||||
* @param localDht The local DHT
|
||||
* @param config
|
||||
*/
|
||||
public StoreOperation(KadServer server, JKademliaNode localNode, StorageEntry storageEntry, DHT localDht, KadConfiguration config)
|
||||
public StoreOperation(KadServer server, JKademliaNode localNode, StorageEntry storageEntry, KademliaDHT localDht, KadConfiguration config)
|
||||
{
|
||||
this.server = server;
|
||||
this.localNode = localNode;
|
||||
|
@ -12,6 +12,7 @@ import java.io.OutputStreamWriter;
|
||||
import java.lang.reflect.Type;
|
||||
import java.util.List;
|
||||
import kademlia.dht.DHT;
|
||||
import kademlia.dht.KademliaDHT;
|
||||
import kademlia.dht.StorageEntryMetadata;
|
||||
|
||||
/**
|
||||
@ -38,7 +39,7 @@ import kademlia.dht.StorageEntryMetadata;
|
||||
*
|
||||
* @since 20140310
|
||||
*/
|
||||
public class JsonDHTSerializer implements KadSerializer<DHT>
|
||||
public class JsonDHTSerializer implements KadSerializer<KademliaDHT>
|
||||
{
|
||||
|
||||
private final Gson gson;
|
||||
@ -54,7 +55,7 @@ public class JsonDHTSerializer implements KadSerializer<DHT>
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(DHT data, DataOutputStream out) throws IOException
|
||||
public void write(KademliaDHT data, DataOutputStream out) throws IOException
|
||||
{
|
||||
try (JsonWriter writer = new JsonWriter(new OutputStreamWriter(out)))
|
||||
{
|
||||
@ -72,7 +73,7 @@ public class JsonDHTSerializer implements KadSerializer<DHT>
|
||||
}
|
||||
|
||||
@Override
|
||||
public DHT read(DataInputStream in) throws IOException, ClassNotFoundException
|
||||
public KademliaDHT read(DataInputStream in) throws IOException, ClassNotFoundException
|
||||
{
|
||||
try (DataInputStream din = new DataInputStream(in);
|
||||
JsonReader reader = new JsonReader(new InputStreamReader(in)))
|
||||
|
Loading…
Reference in New Issue
Block a user