需要开发一个软件实现数以万计个终端之间的数据传输,首先想到的最近又开始疯涨的比特币,比特币、以太坊等虚拟货币采用的就是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 |
---|---|
面向连接 | 无连接 |
数据可靠交付,无差错,不丢失,不重复,且按序到达 | 不可靠交付 |
传输效率低 | 传输效率高 |
一对一 | 一对一、一对多、多对多、多对一 |
有待研究
以上连接方式终端必须和服务器进行长连接或心跳连接,否则终端地址和端口发生改变服务器无法获知。希望能够像比特币一样每个终端能够自动发现新的节点,并向其他终端发送数据。
网友评论