GithubHelp home page GithubHelp logo

muniao / kademlia Goto Github PK

View Code? Open in Web Editor NEW

This project forked from joshuakissoon/kademlia

0.0 2.0 0.0 952 KB

A Java implementation of Kademlia Routing Protocol and DHT

License: MIT License

Java 100.00%

kademlia's Introduction

Kademlia

This is an implementation of the Kademlia (http://en.wikipedia.org/wiki/Kademlia) routing protocol and DHT.

I wrote an article An Introduction to Kademlia DHT & How It Works. Have a read.

Kademlia original Publication: http://link.springer.com/chapter/10.1007/3-540-45748-8_5

Note: This repository is a Netbeans project which you can simply download and import.

Usage

The Implementation is meant to be self contained and very easy to setup and use. There are several tests (https://github.com/JoshuaKissoon/Kademlia/tree/master/src/kademlia/tests) which demonstrates the usage of the protocol and DHT.

Configuration

There is a configuration file available in the kademlia.core package which have all settings used throughout the protocol, all of these settings are described in depth in the Configuration file.

Creating a Kad Instance

All of Kademlia's sub-components (DHT, Node, Routing Table, Server, etc) are wrapped within the Kademlia object to simplify the usage of the protocol. To create an instance, simply call:

Kademlia kad1 = new Kademlia("OwnerName1", new NodeId("ASF45678947584567463"), 12049);
Kademlia kad2 = new Kademlia("OwnerName2", new NodeId(), 12057);  // Random NodeId will be generated

Param 1: The Name of the owner of this instance, can be any name. Param 2: A NodeId for this node Param 3: The port on which this Kademlia instance will run on.

After this initialization phase, the 2 Kad instances will basically be 2 separate networks. Lets connect them so they'll be in the same network.

Connecting Nodes

Test: https://github.com/JoshuaKissoon/Kademlia/blob/master/src/kademlia/tests/NodeConnectionTest.java

kad2.bootstrap(kad1.getNode());   // Bootstrap kad2 by using kad1 as the main network node

Storing Content

Test: https://github.com/JoshuaKissoon/Kademlia/blob/master/src/kademlia/tests/ContentSendingTest.java

/* Working example at: https://github.com/JoshuaKissoon/Kademlia/blob/master/src/kademlia/tests/ContentSendingTest.java */
DHTContentImpl c = new DHTContentImpl(kad2.getOwnerId(), "Some Data");  // Create a content
kad2.put(c);    // Put the content on the network

Retrieving Content

Test: https://github.com/JoshuaKissoon/Kademlia/blob/master/src/kademlia/tests/ContentSendingTest.java

/* Create a GetParameter object with the parameters of the content to retrieve */
GetParameter gp = new GetParameter(c.getKey());   // Lets look for content by key
gp.setType(DHTContentImpl.TYPE);                  // We also only want content of this type
gp.setOwnerId(c.getOwnerId());                    // And content from this owner

/* Now we call get specifying the GetParameters and the Number of results we want */
List<KadContent> conte = kad2.get(gp, 1);

Saving and Retrieving a Node State

Test: https://github.com/JoshuaKissoon/Kademlia/blob/master/src/kademlia/tests/SaveStateTest.java

You may want to save the Node state when your application is shut down and Retrieve the Node state on startup to remove the need of rebuilding the Node State (Routing Table, DHT Content Entries, etc). Lets look at how we do this.

/** 
 * Shutting down the Kad instance.
 * Calling .shutdown() ill automatically store the node state in the location specified in the Configuration file 
 */
kad1.shutdown();

/**
 * Retrieving the Node state
 * This is done by simply building the Kademlia instance by calling .loadFromFile()
 * and passing in the instance Owner name as a parameter
 */
 Kademlia kad1Reloaded = Kademlia.loadFromFile("OwnerName1");

For more information on using Kademlia, check the tests at: https://github.com/JoshuaKissoon/Kademlia/tree/master/src/kademlia/tests

Usage in a Real Project

I am currently using this implementation of Kademlia in developing a Distributed Online Social Network Architecture, you can look at that project at https://github.com/JoshuaKissoon/DOSNA for more ideas on using Kademlia.

kademlia's People

Contributors

joshuakissoon avatar bitdeli-chef avatar

Watchers

James Cloos avatar 刘杰 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.