Java 构建p2p网络

这篇文章是一篇关于pbft算法实现的一篇补充文章,但是在这里不会涉及pbft的算法方面,所以可以当做一篇单独的文章食用。如果想查看关于区块链或者PBFT算法的文章,可以参考一下我的文章

文章实现范围

这篇文章是构建一个p2p网络,需要拥有独立的ip地址(当然如果是在局域网内使用就无所谓了),不会涉及到内网穿透的一些实现方法,也就是说如果你是把自己电脑构建了一个p2p结点,则其他人的电脑是无法链接你电脑的结点的。

预备知识

p2p网络中,一个结点既是客户端也是服务端,可以实现任意时刻的双向的通信。因此在每个结点中,会维护一张客户端的表和一张服务端的表。我们可以从代码的方面来理解一下这个东西,如下图所示:


两个被方框圈住的表则是需要维护的表,如果在代码中的话,我们就可以使用List去保存这张表

客户端的表我们可以用来发送消息,而服务端的表我们可以用来控制群发。

这里我们可以解释和理解一下何为p2p。举例:

结点1想与结点2进行通信时:A1跑出来说,我有到结点2的通道,然后向结点2发出request,结点2的服务端接收到结点1(A1)发出来的消息的时,进行response。

这个时候,可能就会有人问:为什么不是结点1的服务端向结点2发出request呢,然后结点2再向服务端返回response?yes,这个是可以的,并且能够成功。那是不是意味着客户端的表实际上可以不要?当然不是!!!首先我们从哲学的角度理解这个东西,request理所当然应该是client发出来的,response也应当是response发出来的。当然,这个完全是扯蛋。在两个结点中,一个当做server一个当做client,这样确实不会出现问题,当时如果是3个节点呢?这样做能不能实现两两单独发送呢?很抱歉,不能。(注意,在这里是两个结点直接进行request和response,而不借助其他结点)。

下面这种模式是一个结点只为Server,另外的几个也只为Client。在这种模式中,C1和其他的结点无法独自进行两两通信,必须借助Server来进行通信。

OK,说了这么多,那么现在让我们来进行构建P2P网络

Java构建项目

在这里,我将使用maven构建项目,下面是需要使用的工具类:

  • t-io:进行Socket通信。当然,t-io不是必须的,使用websocket或者netty都是可以的

项目地址:github

代码其实没什么好讲的,主要是不熟悉tio的使用,这里,emm,吐槽一下tio,妈耶,文档也太贵了吧(╮(╯▽╰)╭,学生优惠没有了,哭唧唧)。


代码解释

代码其实很简单,就是开上几个server,然后client连接Server就行了。

主要代码如下所示(实际上使用什么框架都行,自己喜欢就行,把思路弄好就可以了):

public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String ip = "127.0.0.1";
// 服务端开始
System.out.println("请输入服务端初始化端口:");
int port = in.nextInt();
// 处理消息handler
ServerAioHandler handler = new P2PServerAioHandler();
// 监听
ServerAioListener listener = new ServerListener();
// 配置
ServerTioConfig config = new ServerTioConfig("服务端", handler, listener);
// 设置timeout
config.setHeartbeatTimeout(Const.TIMEOUT *2);
TioServer tioServer = new TioServer(config);
try {
// 启动
tioServer.start(ip, port);
} catch (IOException e) {
System.out.println("启动错误:" + e.getMessage());
} // client开始
ClientChannelContext[] contexts = new ClientChannelContext[3];
for (int i = 0; i < 3; i++) {
// client的handler
ClientAioHandler clientAioHandler = new P2pClientAioHandler();
// client 的配置
ClientTioConfig clientTioConfig = new ClientTioConfig(clientAioHandler, new P2PClientLinstener(),new ReconnConf(Const.TIMEOUT));
clientTioConfig.setHeartbeatTimeout(Const.TIMEOUT);
ClientChannelContext context;
try {
TioClient client = new TioClient(clientTioConfig);
System.out.println("输入端口:");
int serverPort = in.nextInt();
context = client.connect(new Node(ip, serverPort), Const.TIMEOUT); contexts[i] = context;
} catch (Exception e) {
System.out.println("客户端启动错误:" + e.getMessage());
}
} while (true) {
System.out.println("请输入发送的服务端的index");
int index = in.nextInt();
System.out.println("请输入发送的内容");
String body = in.next();
try {
MsgPacket msgPacket = new MsgPacket();
msgPacket.setBody("测试数据".getBytes(MsgPacket.CHARSET));
Tio.send(contexts[index], msgPacket);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}

思路:

思路还是蛮简单的,先进行server创建,并对他进行配置(配置它的消息处理方式和一些超时属性等等),在tio中,server会在后台(也就是P2PServerAioHandler这个类)接受并处理消息。然后是配置client,同样配置一些Handler和timeout等等。在这里我使用了ClientChannelContext[] contexts = new ClientChannelContext[3]来保存client。ClientChannelContext可以理解为client到server的一根管道,通过他我们可以来控制消息的发送。

项目地址:GitHub

t-io Java构建p2p网络的更多相关文章

  1. IT增值服务-客户案例(三):合肥薪火科技,Java和P2P网络借贷系统开发指导

    客户整体情况: 合肥薪火科技,是安徽合肥一家主营微信开发和运营的中小企业,http://weimarket.cn/. 这家公司筹备.创立.曲折创业的经历,我一直有关注.因为2个老板,都是我的同学校友, ...

  2. AIO 开始不定时的抛异常: java.io.IOException: 指定的网络名不再可用

    一天里会抛出几个这样的错误,但发现服务还在正常的运行. java.io.IOException: 指定的网络名不再可用. at sun.nio.ch.Iocp.translateErrorToIOEx ...

  3. Java学习之网络编程实例

    转自:http://www.cnblogs.com/springcsc/archive/2009/12/03/1616413.html 多谢分享 网络编程 网络编程对于很多的初学者来说,都是很向往的一 ...

  4. Java进阶之网络编程

    网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...

  5. 使用Go语言编写区块链P2P网络(译)(转)

    转自:https://mp.weixin.qq.com/s/2daFH9Ej5fVlWmpsN5HZzw 外文链接: https://medium.com/coinmonks/code-a-simpl ...

  6. 第78节:Java中的网络编程(上)

    第78节:Java中的网络编程(上) 前言 网络编程涉及ip,端口,协议,tcp和udp的了解,和对socket通信的网络细节. 网络编程 OSI开放系统互连 网络编程指IO加网络 TCP/IP模型: ...

  7. 20165324 Java实验五 网络编程与安全

    20165324 Java实验五 网络编程与安全 一.实验报告封面 课程:Java程序设计 班级:1653班 姓名:何春江 学号:20165324 指导教师:娄嘉鹏 实验日期:2018年5月28日 实 ...

  8. JXTA 2: 具有高性能、海量伸缩性的 P2P 网络

    这是来自developerWorks的一篇文章,地址是 https://www.ibm.com/developerworks/cn/java/j-jxta2/ ———————————————————— ...

  9. 2018-2019-2-20175323 java实验五 网络编程与安全

    20175323 java实验五 网络编程与安全 任务一 ①编写MyBC.java实现中缀表达式转后缀表达式的功能 ②编写MyDC.java实现从上面功能中获取的表达式中实现后缀表达式求值的功能 基本 ...

随机推荐

  1. 通用高效的数据修复方法:Row level repair

    导读:随着大数据的进一步发展,NoSQL 数据库系统迅速发展并得到了广泛的应用.其中,Apache Cassandra 是最广泛使用的数据库之一.对于 Cassandra 的优化是大家研究的热点,而 ...

  2. Oracle数据库连接工具的使用(三)

    一.PL/SQL Developer介绍 1.简介 PL/SQL Developer是一个集成开发环境,专门开发面向Oracle数据库的应用.PL/SQL也是一种程序语言,叫做过程化SQL语言(Pro ...

  3. SCU 4439 Vertex Cover|最小点覆盖

    传送门 Vertex Cover frog has a graph with n vertices v(1),v(2),…,v(n)v(1),v(2),…,v(n) and m edges (v(a1 ...

  4. 2019HDU多校第四场题解

    1001.AND Minimum Spanning Tree 传送门:HDU6614 题意:给你一个又n个点的完全图,点编号从1~n,每条边的权值为被连接的两点编号按位与后的值.现在要你找到最小生成树 ...

  5. python防止字符串转义

    部分转自:https://www.cnblogs.com/hellofengying/p/10183057.html 今天再打开文件名时,出现了错误,如下: In []: path='D:\Code\ ...

  6. 【阿里云IoT+YF3300】11.物联网多设备快速通信级联

    我们见到的很多物联网设备,大都是“一跳”上网,所谓的“一跳”就是设备直接上网,内嵌物联网模块或者通过DTU直接上网.其实稍微复杂的物联网现场,往往网关下面连接若干物联网设备(如下图),并且这些物联网设 ...

  7. vscode中nodejs智能提示

    简单粗暴,直接在项目中,运行npm install --save-dev @types/node命令,然后就ok了.

  8. 根据输入参数,判定时间范围CheckTimeSpan

    对于C#的开发的网页程式,一些企业或者工厂可能会运用这些程式去查询一些资料,考虑到查询的资料太多,假如一个月的资料就有上万条数据,在对于查询资料的SQL语句后时间栏位运用Between.....AND ...

  9. Big Event

    666DHG的大事记 2019.4.15 \(\text{ }\text{ }\text{ }\)注册洛谷 2019.8.10 \(\text{ }\text{ }\text{ }\)Luogu\(\ ...

  10. 干货!SQL性能优化,书写高质量SQL语句

    写SQL语句的时候我们往往关注的是SQL的执行结果,但是是否真的关注了SQL的执行效率,是否注意了SQL的写法规范? 以下的干货分享是在实际开发过程中总结的,希望对大家有所帮助! 1. limit分页 ...