在Java

时间:2018-06-20 15:09:15

标签: java sockets blockchain

我必须在我的大学里做练习,它必须使用套接字和“简单方式”序列化来创建区块链。但是,当退出循环时(键入“ NO”),它会在关闭套接字(s.close())时创建我无法解决的EOF异常。我希望得到一些帮助,我不太擅长Java。这是我的课程。

客户

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;


public class Client implements Runnable{

 public static void main(String[] args) throws Exception {

     (new Thread(new Client())).start();


}
public static MedicalReport createReport(){

    return new MedicalReport(10,"pepe","id","record");

}
@Override
public void run() {
//  int port = 12345;       
      //  String computer = "localhost";
        try{
            Socket s = new Socket("localhost", 12348);
            ObjectOutputStream p = new ObjectOutputStream(s.getOutputStream());
            ObjectInputStream in = new ObjectInputStream(s.getInputStream());
           /* PrintWriter print = new PrintWriter(s.getOutputStream());
            print.println("ready");
            print.flush();*/

          //manda informe al servidor serializado y espera respuesta
            boolean stop = false;
            while(!stop){
                try{
                MedicalReport report = createReport();
                p.writeObject(report);
                p.flush();
                p.reset();

                System.out.println("Do you want to continue? Yes or No");
                Scanner in1 = new Scanner (System.in);
                String answer="";
                if(in1.hasNextLine())
                    answer = in1.nextLine();

                if(!answer.equalsIgnoreCase("yes")){
                            System.out.println(report);
                    stop = true;


                    }   
                }
                catch(Exception e){
                    System.out.println(e);
                }

            }

            try{
                    s.close();

            }
            catch(Exception e){
                System.out.println(e);
            }

          }catch(Exception e){
            System.out.println(e);
  }


}

}

服务器

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Scanner;


public class Server {


public static void main(String[] args)
    throws Exception
{
    ArrayList<Block> blockChain = new ArrayList<>();
     try{
            ServerSocket ss = new ServerSocket(12348);
            Socket s = ss.accept();
            ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
            ObjectInputStream in = new ObjectInputStream(s.getInputStream());

         /*   Scanner scanner = new Scanner(s.getInputStream());
            String text = scanner.nextLine();*/


            int i = 0;
            int previousHash = 0;
            while (i != 20){
                MedicalReport rp = (MedicalReport)in.readObject();
                Block block = new Block(rp,previousHash);
                blockChain.add(block);
                    System.out.println("Block " + blockChain.size() + " added to blockchain");
                System.out.println(blockChain.get(i));
                previousHash = block.getBlockHash();
                    System.out.println(blockChain);

                i++;
            }


            try{

                ss.close();
                }
                catch(Exception e){
                    System.out.println(e);
                }


          }catch(Exception e){
            System.out.println(e);
    }

}
}

好像是关闭插座时出错,知道吗?

编辑代码的其余部分

医学报告

import java.io.Serializable;


public class MedicalReport implements Serializable {

private int age;
private String name;
private String id;
private String record;

private static final long serialVersionUID = 1L;

public MedicalReport(){super();}
public MedicalReport(int age, String name, String id, String record) {
    super();
    this.age = age;
    this.name = name;
    this.id = id;
    this.record = record;
}

public String getRecord(){
    return this.record;
}
public String toString(){
    return this.name + ". \n" + this.age + ". \n" + this.id + ". \n" + this.record;
}


}

阻止

public class Block {

private int blockHash;
private int previousHash;
private MedicalReport report;

//Block Constructor.
public Block(MedicalReport report,int previousHash ) {
    this.previousHash = previousHash;
    this.report = report;
    this.blockHash = report.hashCode();
}

public int getPreviousHash() {
    return previousHash;
}

public MedicalReport getReport() {
    return report;
}

public int getBlockHash() {
    return blockHash;
}
}

编辑2 解决了第一个问题。现在退出循环时出现此错误:

java.net.SocketException:对等重置连接:套接字写入错误

2 个答案:

答案 0 :(得分:0)

重要提示:正如EJP所说,EOFException很正常,您可以使用它来控制代码流,但是如果您仍然想知道如何按照此处的要求进行操作是。请记住,这只是您的问题,而未建议您这样做。

在服务器类上

替换

MedicalReport rp = (MedicalReport)in.readObject();

使用

MedicalReport rp;
if((rp = (MedicalReport)in.readObject())==null) break;

关于客户类

添加

p.writeObject(null); 

就在s.close();语句上方

  

您必须知道,当对等方正常关闭连接时,

read() returns -1

readLine() returns null

readXXX() throws EOFException代表任何其他XXX

还有A write will throw an IOException

答案 1 :(得分:0)

当对等方关闭连接时,

readObject()引发EOFEzception。这是正常的。抓住它并停止阅读。这里没有问题可以解决。