All Projects → namuyan → p2p-python

namuyan / p2p-python

Licence: MIT license
Simple peer2peer library. designed for bc4py project.

Programming Languages

python
139335 projects - #7 most used programming language

Projects that are alternatives of or similar to p2p-python

PyVM
A virtual machine written in Python that executes x86 binaries according to the Intel Software Developer Manual
Stars: ✭ 80 (+29.03%)
Mutual labels:  pure-python
rediserver
Pure Python Redis server implementation
Stars: ✭ 26 (-58.06%)
Mutual labels:  pure-python
python-keylogger
Advanced Pure-Python Keylogger
Stars: ✭ 64 (+3.23%)
Mutual labels:  pure-python
acefile
read/test/extract ACE 1.0 and 2.0 archives in pure python
Stars: ✭ 67 (+8.06%)
Mutual labels:  pure-python
pdf-viewer
A Pure Python PDFViewer, which provides functionalities same as other famous PDFViewers.
Stars: ✭ 58 (-6.45%)
Mutual labels:  pure-python

p2p-python

I seek a library that can make a simple P2P network.
This library enables you create P2P application.

IMPORTANT

THIS IS OLD, newly rewritten version 4.0.0 will be released.

Specification

  • Asynchronous IO
  • Pure Python code
  • TCP and UDP connection
  • Automatic network build
  • Python3.6+

How to install

warning: Destructive change from 3.0.0

pip3 install --user p2p-python>=3.0.0

How to use

basic usage with debug tool aiomonitor.
install by pip3 install --user aiomonitor.

from p2p_python.utils import setup_p2p_params, setup_logger
from p2p_python.server import Peer2Peer, Peer2PeerCmd
import logging
import asyncio
import aiomonitor
import time
 
loop = asyncio.get_event_loop()
log = logging.getLogger(__name__)
 
setup_logger(logging.INFO)
 
# setup Peer2Peer
setup_p2p_params(
    network_ver=11111,  # (int) identify other network
    p2p_port=2000, # (int) P2P listen port
    p2p_accept=True, # (bool) switch on TCP server
    p2p_udp_accept=True, # (bool) switch on UDP server
)
p2p = Peer2Peer(listen=100)  # allow 100 connection
p2p.setup()
 
# close method example
def close():
    p2p.close()
    loop.call_later(1.0, loop.stop)
 
# You can setup DirectDmd method
class DirectCmd(object):
 
    @staticmethod
    async def what_is_your_name(user, data):
        print("what_is_your_name", user, data)
        return {"you return": time.time()}
 
    @staticmethod
    async def get_time_now(user, data):
        print("get_time_now", user, data)
        return {"get time now": time.time()}
 
# register methods for DirectCmd
p2p.event.setup_events_from_class(DirectCmd)
# throw cmd by `await p2p.send_direct_cmd(DirectCmd.what_is_your_name, 'kelly')`
# or `await p2p.send_direct_cmd('what_is_your_name', 'kelly')`
 
# You can setup broadcast policy (default disabled)
# WARNING: You must set strict policy or will be broken by users
async def broadcast_check_normal(user, data):
    return True
 
# overwrite method
p2p.broadcast_check = broadcast_check_normal
 
# setup netcat monitor
local = locals().copy()
local.update({k: v for k, v in globals().items() if not k.startswith('__')})
log.info('local', list(local.keys()))
aiomonitor.start_monitor(loop, port=3000, locals=local)
log.info(f"you can connect by `nc 127.0.0.1 3000`")
 
# start event loop
# close by `close()` on netcat console
try:
    loop.run_forever()
except KeyboardInterrupt:
    log.info("closing")
loop.close()

Documents

Author

@namuyan_mine

Licence

MIT

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].