一、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