用Java创建你第一个区块链-part3

      在上一章节中最后说到了要实现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);

        }

    }

}


因为涉及到项目中的资料,所以我这里不能够把一些核心的代码给公布出来,但是核心的逻辑,就是通过服务端与客服端之间的一些消息的通信,让所有数据信息导保存在一个链条上。






猜你喜欢

转载自blog.csdn.net/u010093971/article/details/79443422