【发布时间】:2018-10-25 02:15:41
【问题描述】:
我有一个简单的 java 中简单区块链的 p2p 实现。
我正在尝试发送消息并在发送消息后等待立即响应,以更新客户端的本地“bloomchain”变量。
我尝试使用期货和在后台线程中运行的单线程执行器来执行此操作,但每次等待返回时,我都会遇到如下错误:
java.util.concurrent.ExecutionException: java.io.StreamCorruptedException: invalid type code: 00
java.util.concurrent.ExecutionException: java.io.StreamCorruptedException: invalid type code: 6F
我认为问题可能是等待我设置线程,因为我没有这种方式:
发送消息:
public void sendMessage(String message) {
if (bloomChain.size() < 1) {
System.out.println("Genesis Block");
bloomChain.addBlock(new Block(message, "0"));
} else {
System.out.println("Augmented Block");
bloomChain.addBlock(new Block(message, bloomChain.get(bloomChain.size() - 1).getPreviousHash()));
}
try {
System.out.println("Sending Chain..");
this.outputStream.writeObject(bloomChain);
this.outputStream.flush();
new Thread(()-> {
try {
bloomChain = updateLocalChain();
} catch (ExecutionException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
System.out.println("Chain Sent..");
} catch (IOException e) {
e.printStackTrace();
}
}
更新本地链:
public BloomChain updateLocalChain() throws ExecutionException, InterruptedException {
Future<BloomChain> agreedChain = this.singleThreadExecutor.submit(new Callable<BloomChain>() {
@Override
public BloomChain call() throws IOException, ClassNotFoundException {
Object newChain = null;
while(true){
newChain = inputStream.readObject();
if(newChain instanceof BloomChain){
System.out.println(newChain.toString());
break;
}
}
return (BloomChain) newChain;
}
});
return agreedChain.get();
}
编辑: 在调试过程中,我发现程序收到了预期的响应,但还是产生了错误
【问题讨论】:
标签: java multithreading sockets thread-safety p2p