JavaのビルドP2Pネットワーク
この記事では、サプリメントpbftアルゴリズムについての記事ですが、このアスペクトpbftアルゴリズムに関与することはないだろう、それは別の記事として食べることができます。あなたがブロック鎖またはPBFTアルゴリズムについての記事を参照したい場合は、私を参照することができます記事。
記事の範囲を達成します
この記事では、P2Pネットワークを構築することで、個別のIPアドレスを(それがLAN内で使用されている場合はもちろん、重要ではありません)持つ必要、あなたのコンピュータを入れている場合つまり、ネットワークの浸透内のいくつかの実装を必要としませんP2Pノードを構築し、その後、他の人のコンピュータは、コンピュータのノードをリンクすることができません。
予備
P2Pネットワークは、ノードがいつでも双方向通信を実現することができる、クライアントとサーバ側の両方です。したがって、各ノードにおいて、サービスは、テーブルと終了テーブルクライアントを維持します。私たちは、コードの観点から、以下に示すように、この事は、あるものを理解することができます。
2つのボックスには、テーブルには、我々はこのテーブルを保存するためのコードでリストを使用することができそうだとすれば、テーブルを維持する必要があることである丸で囲みました
私たちは、メッセージを送信するために使用できるクライアントテーブル、およびテーブルのサービス側では、我々は質量を制御するために使用することができます。
ここでは、P2Pであるかについて説明し、理解することができます。例えば:
ノード1は、2ノードと通信したい:A1は、私はチャンネルノードに2を持って、その後、ノード2に送信された、走ったrequest
、ノード2は、に発行されたサービス終了ノード1(A1)を受信しますメッセージは、応答を行った場合。
这个时候,可能就会有人问:为什么不是结点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