nodejs 实现简单p2p网络

一、p2p的原理

p2p是对等网络(peer-to-peer networking)其可以定义为:端对端的资源共享,每一端即可是服务端,也可以是客户端。既可以是资源的提供者,也可以是资源的共享者。

传统网络架构,客户端之间是无直接交互的,而P2P则不需要将资源上传到服务器。

优势:实时性高,流量少,更加安全。在视频直播,在线教育,视频安防行业用的比较多。
劣势:进行p2p传输之后,用户之间的内容将无法监管,浪费用户带宽,频繁进行读写磁盘。

二、实现过程

根据之前实现多人聊天室的经验,不再将客户端全都连接在一个端口上,而让客户端指定要连接的端口,并当其连接服务端时,也分配一个服务端端口给它,使其他客户端可以通过这个端口连接上它。

 let server = new WebSocket.Server({port: p2p_port});
    server.on('connection', ws => {
        initConnection(ws)
    });
    let s = "ws://localhost:" + read.question("作为客户端要连接的端口:");

    let socket = new WebSocket(s);
    server_me = socket
    socket.on('open', () => {
        initConnection(socket)
    });
    socket.on('error', () => {
        console.log('连接失败:该端口可能未开启');
    })
    console.log('listening websocket p2p port on:' + p2p_port);   

广播信息时,如果向所有连接上的端口广播,可能会出现两个端口之间重复发送同一个信息,只好封闭一个方向的广播,这样可以解决部分问题,但也有其他问题产生,比如这样可能有部分节点接受不到某些信息,以及如果节点之间如果构成一个环,仍然会出现重复发送信息的情况。针对这个问题希望有大佬能够解决一下。

let broadcast=(message)=>{
    sockets.forEach(socket =>write(socket,message));
};
let initMessageHandler=(ws)=>{
    ws.on('message',(data)=>{
        if(ws!==server_me){
            console.log("收到了从端口"+ws._socket.remotePort+"发送来的信息:"+data)
            console.log("广播了一条信息")
            broadcast(data);
        }else{
            console.log("阻止了端口:"+ws._socket.remotePort+"回复的信息")
        }
    })
};

运行截图

在这里插入图片描述

链接

git仓库链接:https://github.com/szj627/blockchain.git
参考文章链接:https://blog.csdn.net/mengzaishenqiu/article/details/80540843

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值