banner



How To Create P2p Connection

Fullstack developer, a passionate for computer science and human-computer interaction

Make a P2P connection in 10 minutes

Published Jun 08, 2018 Last updated Dec 05, 2018

p2p

This is a short guide on how to make a P2P chat. My aim is to give you only a taste, if you like I could write a more deeper article explaining how all this things work. That said, lets start.

Preparation

The only thing you will need is the latest NodeJS and your favorite editor, mine is Visual Studio Code. Now create a folder for our project, open a command line, initialize an npm repo with npm init and install some libraries we will need with:

              npm i --save discovery-swarm dat-swarm-defaults portfinder get-port                          

I will explain what this libraries does later.

Our fisrt P2P connection

Lets start by doing a simple P2P connection, thanks to some great libraries from the Node.js community it is too simple:

                              const                crypto =                require('crypto')                const                Swarm =                require('discovery-swarm')                const                defaults =                require('dat-swarm-defaults')                const                getPort =                require('get-port')                const                readline =                require('readline')                /**  * Here we will save our TCP peer connections  * using the peer id as key: { peer_id: TCP_Connection }  */                const                peers = {}                // Counter for connections, used for identify connections                let                connSeq =                0                // Peer Identity, a random hash for identify your peer                const                myId = crypto.randomBytes(32)                console.log('Your identity: '                + myId.toString('hex'))                // reference to redline interface                let                rl                /**  * Function for safely call console.log with readline interface active  */                                  function                  log                  ()                {                if                (rl) {     rl.clearLine()         rl.close()     rl =                undefined                }                for                (let                i =                0, len =                arguments.length; i < len; i++) {                console.log(arguments[i])   }   askUser() }                /* * Function to get text input from user and send it to other peers * Like a chat :) */                const                askUser =                async                () => {   rl = readline.createInterface({                input: process.stdin,                output: process.stdout   })    rl.question('Send message: ', message => {                // Broadcast to peers                for                (let                id                in                peers) {       peers[id].conn.write(message)     }     rl.close()     rl =                undefined                askUser()   }); }                /**   * Default DNS and DHT servers  * This servers are used for peer discovery and establishing connection  */                const                config = defaults({                // peer-id                id: myId, })                /**  * discovery-swarm library establishes a TCP p2p connection and uses  * discovery-channel library for peer discovery  */                const                sw = Swarm(config)   ;(                    async                    () =>                {                // Choose a random unused port for listening TCP peer connections                const                port =                await                getPort()    sw.listen(port)                console.log('Listening to port: '                + port)                /**    * The channel we are connecting to.    * Peers should discover other peers in this channel    */                sw.join('our-fun-channel')    sw.on('connection', (conn, info) => {                // Connection id                const                seq = connSeq                const                peerId = info.id.toString('hex')     log(`Connected #${seq}                  to peer:                  ${peerId}`)                // Keep alive TCP connection with peer                if                (info.initiator) {                try                {         conn.setKeepAlive(true,                600)       }                catch                (exception) {         log('exception', exception)       }     }      conn.on('data', data => {                // Here we handle incomming messages                log(                'Received Message from peer '                + peerId,                '----> '                + data.toString()       )     })      conn.on('close', () => {                // Here we handle peer disconnection                log(`Connection                  ${seq}                  closed, peer id:                  ${peerId}`)                // If the closing connection is the last connection with the peer, removes the peer                if                (peers[peerId].seq === seq) {                delete                peers[peerId]       }     })                // Save the connection                if                (!peers[peerId]) {       peers[peerId] = {}     }     peers[peerId].conn = conn     peers[peerId].seq = seq     connSeq++    })                // Read user message from command line                askUser()    })()                          

Run this code in two consoles and this is it!. Now you can run it in other device right in your LAN and should work even without internet, also you can share and run this script in any other computer with internet, it just works, so nice!

What's is next?

We will build a P2P chat for our long term project using this code. The chat will have end-to-end encryption and can verify messages.

Make a P2P chat in 10 minutes (Soon …)

I love feedback, ask me questions, comment your experience with P2P technologies and share your ideas!


This series is possible thanks to the awesome tools delivered by the DatProject, Webtorrent and the NodeJS community.

This article is part of a medium-term project you can find here:

Create a P2P Real-Time Game App

Enjoy this post? Give Carlos Galarza a like if it's helpful.

Fullstack developer, a passionate for computer science and human-computer interaction

I am a passionate for the Web platform, I am a proactive developer that love Opensource and give value to my clients through a good design, performance and user experience

Discover and read more posts from Carlos Galarza

Enjoy this post?

Leave a like and comment for Carlos

How To Create P2p Connection

Source: https://www.codementor.io/@carlosgalarza/make-a-p2p-connection-in-10-minutes-kb6k5505s

Posted by: rothcomn1971.blogspot.com

0 Response to "How To Create P2p Connection"

Post a Comment

Iklan Atas Artikel

Iklan Tengah Artikel 1

Iklan Tengah Artikel 2

Iklan Bawah Artikel