class DHTPeerFinder(PeerFinder): # TODO: rename MetaNet to this _default_peers = [ { "host": "violet.shishnet.org", "port": 52525 } ] def __init__(self, core): self.core = core self.sender = Thread(target=self.run, name="DHTPeerFinder[Send]") self.sender.daemon = True def start(self): self.sender.start() def run(self): self._log("Getting external IP info") nat_type, external_ip, external_port = stun.get_ip_info() #nat_type, external_ip, external_port = None, "0.0.0.0", 12345 self._log("Public addr: %s:%s" % (external_ip, external_port)) self._log("Connecting to DHT") self.dht = DHT("0.0.0.0", 52525) self.public_contact = (external_ip, external_port) for peer in self.core.config.get("peers", self._default_peers): self.dht.bootstrap(peer["host"], peer["port"]) def _log(self, msg): log.info("[MetaNet] %s" % msg) def offer(self, chunk): self._log("Offering %s" % chunk.id) if chunk.id not in self.dht: self.dht[chunk.id] = [self.public_contact] else: self.dht[chunk.id] = self.dht[chunk.id] + [self.public_contact] def request(self, chunk): self._log("Requesting %s" % chunk.id)
from pydht import DHT import sys import json import tempfile from twisted.python import log from twisted.internet import reactor NUM_NODES = 2 PORT_START = 4000 HOST = "localhost" print "Creating node, joining network" node = DHT("localhost", PORT_START + 50) node.bootstrap("localhost", PORT_START) print "Done." class MyServerProtocol(WebSocketServerProtocol): def makeUrl(self): return tempfile.NamedTemporaryFile() def onConnect(self, request): print "Client connecting: {}".format(request.peer) def onOpen(self): print "WebSocket connection open." def onMessage(self, payload, isBinary): global node
def join_network(hostname, port, boot_host, boot_port): n = DHT(hostname, port) n.bootstrap(boot_host, boot_port) return n