P2P内网穿透

需要开发一个软件实现数以万计个终端之间的数据传输,首先想到的最近又开始疯涨的比特币,比特币、以太坊等虚拟货币采用的就是P2P网络。
数据发送基本采用的UDP协议和TCP/IP协议,局域网穿透用的NAT端口映射技术和UPnP协议。UPnP协议有空再做详细研究,今天先简单的用Java socket实现了P2P内网穿透功能,代码就不贴了,简单讲下步骤。

socket实现p2p网络传输

传统IO方式

server端:
1.创建一个serverSocket监听8080端口
2.创建一个线程不断调用阻塞方法serversocket.accept()获取新的连接
3.给每条连接创建一个新的线程,读取数据

client端:
1.终端A连接服务器发送请求,获取终端B的网络地址和端口
2.终端A获取终端B的地址和端口后,直接发送数据

NIO方式

server端:
1.同样创建一个serverSocket监听8080端口
2.获取socket连接,将连接注册到NIO的selector
3.检查selector,批量监测出有数据可读的连接读取数据

NIO和IO方式对比

IO NIO
面向流 面向缓冲
阻塞IO 非阻塞IO
选择器

IO模型中会给每一个连接都创建一个线程,NIO模型中单个线程管理多个连接;IO模型通过字节流读取数据,NIO模型从通道读取数据直到所有数据读取到缓冲区,解析数据比字节流读取更复杂;NIO模型适合成千上万的连接,每个连接只发送少量数据,IO模型适合少量连接,每次发送大量的数据。
JDK的NIO封装框架Netty,Netty是一个异步事件驱动的网络应用框架,用于快速开发可维护的高性能服务器和客户端。

TCP与UDP协议对比

TCP UDP
面向连接 无连接
数据可靠交付,无差错,不丢失,不重复,且按序到达 不可靠交付
传输效率低 传输效率高
一对一 一对一、一对多、多对多、多对一

有待研究

以上连接方式终端必须和服务器进行长连接或心跳连接,否则终端地址和端口发生改变服务器无法获知。希望能够像比特币一样每个终端能够自动发现新的节点,并向其他终端发送数据。

你可能感兴趣的:(P2P内网穿透)