在上一章节中最后说到了要实现p2p网络,那么在这一章节中就主要说一下p2p网络,实现的方式是什么,以及为什么要实现p2p网络。
首先先简单的介绍一下什么是p2p网络?p2p网络技术又称为对等网络技术,是一种网络的新技术,依赖网络中参与者的计算能力和带宽,而不是把依赖都聚集在较少的几台服务器上。举个比特币网络中的例子,之所以能够在比特币网络中实现数据的去中心化以及不可篡改,除了依赖于区块链技术,更因为其内在的激励机制。现在比特币的价格大家都是有目共睹的,但是如何保证这个价格,所有的挖矿者都认为整个比特币网络可能被攻击者给恶意攻击,所以它们必须提供自己的算力,来不断保证链上的数据是最长的且没有经过篡改。
做过后台管理系统的同学们都知道,给一个企业做后台管理系统,都需要部署其tomcat、数据库等等,将其部署在自己的私有机器或者阿里云上,大多数企业都非常重视其数据,所以一般对于生产数据都是需要其相应管理权限的人员才可以查看,这就导致了下面的几个问题。
1、数据的不透明:只针对于内部员工展现数据。
2、数据的不联通:不同企业之间的数据无法关联,如果需要关联必须通过接口进行定制化的开发。
3、数据的不共享:每个企业的数据都只在自己的服务器上,无法通过大数据分析统计出整个行业的趋势。
而在区块链中最重要的特性就是去中心化、不可篡改、可追踪。针对上述问题的解决方案为:
1、数据加密存储:核心数据只有具备权限的相关人员才能够查看,在链上的数据只包括走向,而不包含其核心数据。
2、数据溯源:在链上记录下所有数据,打通数据孤岛,产生一个可追踪的数据交易平台。
3、数据链:适合多方参与、信息交互的场景,将分散的数据库连接起来,又可以保护其参与各方的隐私。
所以为了实现数据确权,打通数据孤岛,让所有分布在各个节点上的数据因为其业务处理关系而联系在一起,我采用了socket方式,让所有节点之间的数据可以进行通信。
先简单的介绍两种socket编程
一、一个服务端和一个客户端之间的通信
SocketServer类
public class SocketServer {
public static void main(String[] args) {
try {
/** 创建ServerSocket*/
// 创建一个ServerSocket在端口2013监听客户请求
ServerSocket serverSocket =new ServerSocket(2013);
while (true) {
// 侦听并接受到此Socket的连接,请求到来则产生一个Socket对象,并继续执行
Socket socket = serverSocket.accept();
/** 获取客户端传来的信息 */
// 由Socket对象得到输入流,并构造相应的BufferedReader对象
BufferedReader bufferedReader =new BufferedReader(new InputStreamReader(socket.getInputStream()));
// 获取从客户端读入的字符串
String result = bufferedReader.readLine();
System.out.println("Client say : " + result);
/** 发送服务端准备传输的 */
// 由Socket对象得到输出流,并构造PrintWriter对象
PrintWriter printWriter =new PrintWriter(socket.getOutputStream());
printWriter.print("hello Client, I am Server!");
printWriter.flush();
/** 关闭Socket*/
printWriter.close();
bufferedReader.close();
socket.close();
}
}catch (Exception e) {
System.out.println("Exception:" + e);
}finally{
// serverSocket.close();
}
}
}
SocketClient类
public class SocketClient {
public static void main(String[] args) {
try {
/** 创建Socket*/
// 创建一个流套接字并将其连接到指定 IP 地址的指定端口号(本处是本机)
Socket socket =new Socket("127.0.0.1",2013);
// 60s超时
socket.setSoTimeout(60000);
/** 发送客户端准备传输的信息 */
// 由Socket对象得到输出流,并构造PrintWriter对象
PrintWriter printWriter =new PrintWriter(socket.getOutputStream(),true);
// 将输入读入的字符串输出到Server
BufferedReader sysBuff =new BufferedReader(new InputStreamReader(System.in));
printWriter.println(sysBuff.readLine());
// 刷新输出流,使Server马上收到该字符串
printWriter.flush();
/** 用于获取服务端传输来的信息 */
// 由Socket对象得到输入流,并构造相应的BufferedReader对象
BufferedReader bufferedReader =new BufferedReader(new InputStreamReader(socket.getInputStream()));
// 输入读入一字符串
String result = bufferedReader.readLine();
System.out.println("Server say : " + result);
/** 关闭Socket*/
printWriter.close();
bufferedReader.close();
socket.close();
}catch (Exception e) {
System.out.println("Exception:" + e);
}
}
}
二、一个服务端和多个客户端之间的通信
Server类 启用多个线程来接受客服端信息
public class Server extends ServerSocket {
private static final int SERVER_PORT =2013;
public Server()throws IOException {
super(SERVER_PORT);
try {
while (true) {
Socket socket = accept();
new CreateServerThread(socket);//当有请求时,启一个线程处理
}
}catch (IOException e) {
}finally {
close();
}
}
//线程类
class CreateServerThread extends Thread {
private Socket client;
private BufferedReader bufferedReader;
private PrintWriter printWriter;
public CreateServerThread(Socket s)throws IOException {
client = s;
bufferedReader =new BufferedReader(new InputStreamReader(client.getInputStream()));
printWriter =new PrintWriter(client.getOutputStream(),true);
System.out.println("Client(" + getName() +") come in...");
start();
}
public void run() {
try {
String line = bufferedReader.readLine();
while (!line.equals("bye")) {
printWriter.println("1continue, Client(" + getName() +")!");
line = bufferedReader.readLine();
System.out.println("1Client(" + getName() +") say: " + line);
}
printWriter.println("bye, Client(" + getName() +")!");
System.out.println("Client(" + getName() +") exit!");
printWriter.close();
bufferedReader.close();
client.close();
}catch (IOException e) {
}
}
}
public static void main(String[] args)throws IOException {
new Server();
}
}
SocketClient类
public class SocketClient {
public static void main(String[] args) {
try {
Socket socket =new Socket("127.0.0.1",2013);
socket.setSoTimeout(60000);
PrintWriter printWriter =new PrintWriter(socket.getOutputStream(),true);
BufferedReader bufferedReader =new BufferedReader(new InputStreamReader(socket.getInputStream()));
String result ="";
while(result.indexOf("bye") == -1){
BufferedReader sysBuff =new BufferedReader(new InputStreamReader(System.in));
printWriter.println(sysBuff.readLine());
printWriter.flush();
result = bufferedReader.readLine();
System.out.println("2Server say : " + result);
}
printWriter.close();
bufferedReader.close();
socket.close();
}catch (Exception e) {
System.out.println("Exception:" + e);
}
}
}
因为涉及到项目中的资料,所以我这里不能够把一些核心的代码给公布出来,但是核心的逻辑,就是通过服务端与客服端之间的一些消息的通信,让所有数据信息导保存在一个链条上。
---------------------
【转载】
作者:sunny_ice
原文:https://blog.csdn.net/u010093971/article/details/79443422
|
|