如何在Node.js中创建最佳的P2P应用程序?

4
我想知道如何创建一个P2P应用程序。是否只有一种方法或多种方法。我认为每个用户都需要创建一个服务器和一个连接,或者多个连接到多个对等方。这是否准确,还是我需要做些不同的事情?
以下是我创建的一些代码,最终版本将首先创建服务器,然后请求主机:端口连接到对等方。我想知道是否可以仅使用net.createConnection()或其他更简单的方式创建P2P应用程序?还是每个用户都必须成为自己的服务器?
const net = require('net')
const readline = require('readline')

const host = 'localhost'
const port = 3000

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
})

rl.on('line', (line) => {
    if(line == 'server') {
        const server = net.createServer((connection) => {
            console.log('peer connected')
            /**/
            connection.on('data', (data) => {
                console.log(data.toString())
            })
            /**/
            rl.on('line', (line) => {
                connection.write('server: ' + line)
            })
            rl.prompt()
            /**/
        }).listen(port)
    }
    else if(line == 'client') {
        const client = net.createConnection(port, host, () => {
            console.log('connected to peer')
            /**/
            client.on('data', (data) => {
                console.log(data.toString())
            })
            /**/
            rl.on('line', (line) => {
                client.write('client: ' + line)
            })
            rl.prompt()
            /**/
        })
    }
}).on('close', () => {
    process.exit(0);
})

你可能想要查看p2p模块 - Golo Roden
我已经看过了P2P模块,我不想在这种情况下使用别人的模块。 - sweetroll
1个回答

7

您的代码适用于两个客户端的情况,但是如果有更多的客户端,您可能已经注意到这并不容易。

这是因为您需要多个层/工具:

  • 一种带有地址空间的覆盖网络协议,以便每个客户端都有自己的地址。这些地址将通过路由表转换为IP地址,因此被称为覆盖网络协议。例如,如果您有3位地址空间,则可以拥有8个唯一的客户端。我更喜欢宽广的地址范围,其中客户端随机生成自己的ID。Kademlia 是一个很好的例子。

  • 现在您已经解决了寻址和路由问题,下一个问题是如果网络完全是点对点的,那么客户端如何获得初始路由表并连接。要解决此问题,您需要一些具有静态IP和高可用性的节点,称为启动程序。

    当两个客户端可以通过应用程序地址空间中的唯一地址找到彼此时,您的代码会完成聊天的其余部分。通常需要加密和一对公钥/私钥。您可以使用公钥的哈希作为客户端的唯一ID。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接