区块链中Java基于WebSocket构建P2P网络

article/2025/9/27 22:17:27

一、pom依赖

       <dependency><groupId>org.java-websocket</groupId><artifactId>Java-WebSocket</artifactId><version>1.5.1</version></dependency>

二、服务端代码

package com.peck.blockchain.p2p;import org.java_websocket.WebSocket;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.testng.util.Strings;import javax.annotation.PostConstruct;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.List;/*** @author songanning* @ClassName:P2pPointServer* @Description:基于springBoot的WebSocket服务端* @Date:2021/11/23 10:18*/
@Component
public class P2pPointServer {/*** 日志记录*/private Logger logger = LoggerFactory.getLogger(P2pPointServer.class);/*** 本机Server的WebSocket端口* 多机测试可以改变该值*/private int port = 7001;/*** 所有连接到服务端的WebSocket缓存器*/private List<WebSocket> localSockets = new ArrayList<WebSocket>();public List<WebSocket> getLocalSockets() {return localSockets;}public void setLocalSockets(List<WebSocket> localSockets) {this.localSockets = localSockets;}/*** 初始化P2P Server端**/@PostConstruct@Order(1)public void initServer() {/*** 初始化WebSocket的服务端定义内部类对象socketServer,源于WebSocketServer;* new InetSocketAddress(port) 是WebSocketServer构造器的参数* InetSocketAddress是(Ip地址+端口号)类型,即端口地址类型*/final WebSocketServer socketServer = new WebSocketServer(new InetSocketAddress(port)) {/*** 重写5个事件方法,事件发生时触发对应的方法*/@Override//创建连接成功时触发public void onOpen(WebSocket webSocket, ClientHandshake clientHandshake) {sendMessage(webSocket,"北京服务端成功创建连接");//当成功创建一个WebSocket连接时,将该链接加入连接池localSockets.add(webSocket);}@Override//断开连接时触发public void onClose(WebSocket webSocket, int i, String s, boolean b) {logger.info(webSocket.getRemoteSocketAddress() + "客户端与服务器断开连接!");//当客户端断开连接时,WebSocket连接池删除该链接localSockets.remove(webSocket);}@Override//收到客户端发送来的消息时触发public void onMessage(WebSocket webSocket, String msg) {logger.info("北京服务端接收到客户端消息:" + msg);sendMessage(webSocket,"收到消息");}@Override//连接发生错误时调用,紧接着触发onClose方法public void onError(WebSocket webSocket, Exception e) {logger.info(webSocket.getRemoteSocketAddress() + "客户端连接错误!");localSockets.remove(webSocket);}@Overridepublic void onStart() {logger.info("北京服务端监听socketServer端启动......");}};socketServer.start();logger.info("北京服务端监听socketServer端口:" + port);}/*** 向连接到本机的某客户端发送消息*/public void sendMessage(WebSocket ws,String message) {logger.info("发送给" + ws.getRemoteSocketAddress().getPort() + "的篇p2p消息是:" + message);ws.send(message);}/*** 向所有连接到本机的客户端广播消息* @param message*/public void broatcast(String message) {if (localSockets.size() == 0 || Strings.isNullOrEmpty(message)) {return;}logger.info("Glad to say broatcast to clients being startted!");for (WebSocket socket : localSockets) {this.sendMessage(socket,message);}logger.info("Glad to say broatcast to clients has overred!");}
}

三、客户端代码

package com.peck.blockchain.p2p;import org.java_websocket.WebSocket;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.testng.util.Strings;import javax.annotation.PostConstruct;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;/*** @author songanning* @ClassName:P2pPointClient* @Description:基于SpringBoot的WebSocket客户端* @Date:2021/11/23 11:09*/
@Component
public class P2pPointClient {/*** 日志记录*/private Logger logger = LoggerFactory.getLogger(P2pPointClient.class);/*** p2p 网络中的节点既是服务端,又是客户端。作为服务端运行在7001端口* (P2pPointServer 的port字段),同时作为客户通过ws://localhost:7001连接到服务器*/private String wsUrl = "ws://localhost:7001/";/*** 所有客户端WebSocket的连接池缓存*/private List<WebSocket> localSockets = new ArrayList<>();public List<WebSocket> getLocalSockets() {return localSockets;}public void setLocalSockets(List<WebSocket> localSockets) {this.localSockets = localSockets;}/*** 连接到服务器*/@PostConstruct@Order(2)public void connentPeer() {try {final WebSocketClient socketClient = new WebSocketClient(new URI(wsUrl)) {@Overridepublic void onOpen(ServerHandshake serverHandshake) {sendMessage(this,"北京客户端成功创建客户端");localSockets.add(this);}@Overridepublic void onMessage(String msg) {logger.info("北京客户端收到北京服务端发送的消息:" + msg);}@Overridepublic void onClose(int i, String s, boolean b) {logger.info("北京客户端关闭");localSockets.remove(this);}@Overridepublic void onError(Exception e) {logger.info("北京客户端报错");localSockets.remove(this);}};//客户端开始连接服务端socketClient.connect();}catch (URISyntaxException e) {e.printStackTrace();}}/*** 向服务端发送消息,当前WebSocket的远程Socket地址就是服务端* @param ws* @param message*/public void sendMessage(WebSocket ws,String message) {logger.info("发送给" + ws.getRemoteSocketAddress().getPort() + "的p2p消息:" + message);ws.send(message);}/*** 向所有连接过的服务端广播消息* @param message 待广播的消息*/public void broadcast(String message) {if (localSockets.size() == 0 || Strings.isNullOrEmpty(message)) {return;}logger.info("Glad to say broatcast to servers being startted!");for (WebSocket socket:localSockets) {this.sendMessage(socket,message);}logger.info("Glad to say broatcast to servers has overred!");}
}

四、运行截图

在这里插入图片描述


http://chatgpt.dhexx.cn/article/WSCldpBQ.shtml

相关文章

区块链P2P网络

区块链P2P网络 阅读大概需要10分钟 前言 上两篇文章中我们聊了共识机制&#xff0c;今天我们聊一下区块链技术中的另外一个核心技术点&#xff1a;P2P网络&#xff08;Peer to peer networking&#xff09;。首先澄清一点的是这里讲的P2P这个概念跟平时我们在互联网金融圈提及…

Rust P2P网络应用实战-1 P2P网络核心概念及Ping程序

本系列文章首先研究P2P网络的核心概念&#xff0c;然后详细分析libp2p-rust库中的应用实例&#xff0c;为以后开发P2P网络应用程序打好基础。 P2P网络 P2P(Peer-to-Peer)是一种网络技术&#xff0c;可以在网络中不同的计算机上共享各种计算资源&#xff0c;如CPU、网络带宽和存…

区块链P2P网络协议演进过程

区块链是以加密机制、储存机制、共识机制等多种技术组成的分布式系统&#xff0c;可以在无中心服务器的情况下实现相互信任的点对点交易功能。区块链最大的特点是去中心化和分布式&#xff0c;区块链共识机制使得参与节点共同为系统提供服务&#xff0c;实现中心化系统中类似金…

【区块链实战】什么是 P2P 网络,区块链和 P2P 网络有什么关系

目录 一、简介 二、知识点 P2P 网络 区块链节点与 P2P 的关系 区块链节点功能分类 P2P 网络特征 三、什么是 P2P 网络&#xff0c;区块链式使用 P2P 网络做什么 1、P2P 网络概念 2、P2P 网络节点特征 3、P2P 与区块链 4、网络节点功能 一、简介 在白皮书中&#xf…

Peer to Peer ( P2P ) 综述

Peer to Peer ( P2P ) 综述 罗杰文 luojwics.ict.ac.cn 中科院计算技术研究所 2005-11-3 1 绪言 1.1 Peer-To-Peer 介绍 最近几年&#xff0c;对等计算 目前,在学术界、工业界对于P2P没有一个统一的定义&#xff0c;下面列举几个常用的定义供参考&#xff1a; 定义:1、Pe…

Ubuntu对分区扩容

Ubuntu对分区扩容 准备工具 1、U盘 2、准备好的内存空间 3、Ubuntu的镜像文件 4、清楚如何进入自己电脑的BIOS 扩容大致方向try Ubuntu 网络上的扩容方法大都是在自己的Ubuntu下使用GParted,对将要扩容的分区进行卸载&#xff0c;然后进行扩容&#xff0c;但是这样做有个前…

linux ubuntu 分区,查看Ubuntu分区列表方法

今天在Ubuntu修复Grub正好碰到了要展示分区列表看看 不然都不清楚哪个是哪个了。。 sudo fdisk -l 就是这个命令 ubuntuubuntu:~$ sudo fdisk -l Disk /dev/sda: 250.0 GB, 250059350016 bytes 255 heads, 63 sectors/track, 30401 cylinders Units cylinders of 16065 * 512 …

U盘安装ubuntu20.04 Linux系统分区方案 Invalid Partition Table

一、简介&#xff1a; 一般磁盘分区表有两种格式&#xff1a;MBR和GPT&#xff0c;目前主要的BIOS系统引导方式也有两种&#xff1a;传统的Legacy BIOS和新型的UEFI BIOS 如果主机BIOS系统引导方式采用传统的Legacy BIOS&#xff0c;那么安装ubuntu系统的磁盘分区表使用MBR格式…

Android布局

目录 1. Android的基础布局 2. LinearLayout 线性布局 3. RelativeLayout 4. 常用的控件 1. Android的基础布局 LinearLayout 线性布局 RelativeLayout 相对布局 TableLayout 表格布局 FrameLayout 帧布局&#xff08;框架布局&#xff09; ConstrantLayout 约束布局 &…

安卓布局简单归纳

安卓布局 1.线性布局LinearLayout 2.表格布局TableLayout以及网格布局GridLayout 3.帧布局FrameLayout 4.相对布局RelativeLayout 5.Android2.0已经过时的绝对布局AbsoluteLayout 这里仅谈xml的实现、不涉及java实现 布局管理器及组件的常用共有属性&#xff1a; 属性作用and…

安卓layout布局三等分

关于android LinearLayout的比例布局&#xff0c;主要有以下三个属性需要设置&#xff1a; 1&#xff0c;android:layout_width&#xff0c;android:layout_height,android:layout_weight三个值 2&#xff0c;当为水平布局时&#xff0c;android:layout_height“0dp",当为…

安卓APP(3)——安卓布局控件

嵌入式之路&#xff0c;贵在日常点滴 ---阿杰在线送代码 目录 一、布局的种类 二、布局和页面的关系 三、显示一张美女图 控件的宽度和高度 四、布局背景颜色&#xff0c;背景图&#xff0c;显示两个美女 关于控件ID 五、常用布局之相对布局 RelativeLayout中子控件常…

安卓的相对布局与线性布局

一、安卓布局的种类 Android共有七大基本布局。 分别是&#xff1a;线性布局LinearLayout、表格布局TableLayout、相对布局RelativeLayout、帧布局FrameLayout、绝对布局AbsoluteLayout、网格布局GridLayout。约束布局ConstraintLayout。 其中&#xff0c;表格布局是线性布局的…

Android:布局

Android&#xff1a;布局 LinearLayoutRelativeLayoutFrameLayoutTableLayoutGridLayoutConstraintLayout LinearLayout <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_height"match_parent"android:layout_…

安卓六大布局之 线性布局(LinearLayout)

Android的界面是有布局和组件协同完成的&#xff0c;布局好比是建筑里的框架&#xff0c;而组件则相当于建筑里的砖瓦。组件按照布局的要求依次排列&#xff0c;就组成了用户所看见的界面。 Android的六大布局分别是 LinearLayout&#xff08;线性布局&#xff09;RelativeLayo…

Android-布局管理器

线性布局(Linearlayout) 属性 orientation 布局管理器内组件的排列方式(horizontal&#xff08;水平&#xff09;和vertical&#xff08;垂直&#xff09;&#xff0c;默认值为 horizontal.) layout_weight 权重 用于设置组件占父容器剩余空间的比例 la…

android 布局

android学习笔记&#xff08;一 android布局学习&#xff09; 转自http://blog.sina.com.cn/s/blog_61c62a960100ev3q.html (2009-09-20 20:50:44) 转载 标签&#xff1a; it 分类&#xff1a;android 最近痴迷上了android &#xff0c; 因为有java 语言的基础学起来自己感觉很…

安卓六大布局介绍

安卓六大布局 布局的介绍安卓六大布局 布局的介绍 用户使用安卓看到的应用界面&#xff0c;是通过布局和组件构成的&#xff0c;组件根据布局的格式排列&#xff0c;形成用户所看到的界面。 安卓六大布局 线性布局方式&#xff08;LinearLayout&#xff09; 按照垂直或者水平…

安卓线性布局

安卓线性布局 &#xff08;一&#xff09;界面与布局1、界面2、布局&#xff08;1&#xff09;UI容器&#xff08;2&#xff09;UI控件 (Control)&#xff08;3&#xff09;两种方式声明布局 &#xff08;二&#xff09;线性布局&#xff08;1&#xff09;常用属性 &#xff08…