美文网首页
P2P内网穿透

P2P内网穿透

作者: IT油条 | 来源:发表于2019-05-19 22:21 被阅读0次

    需要开发一个软件实现数以万计个终端之间的数据传输,首先想到的最近又开始疯涨的比特币,比特币、以太坊等虚拟货币采用的就是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内网穿透

          本文链接:https://www.haomeiwen.com/subject/xqnqzqtx.html