如何使用java实现tcp的p2p的打洞技术

Python021

如何使用java实现tcp的p2p的打洞技术,第1张

公网设服务器S, 2p点(P1.P2) 连S,过S双方获取对方公网IP.

P1 P2都向对方的(公网IP+任意端口)发起连接,当然无任何回应,但是会发生2件事

1 P1 P2都在自己的外网NAT上打了个连接对方的洞,这个洞会保持一会儿.

2 连接的时候S抓取到P1 P2 的NAT端口,然后将此端口发送给对方,

然后就可以想办法连接了.

在JAVA中,发送和接收多播信息的方法: 

发送多播信息需经历步骤 

确定发送的具体信息内容 

String msg = "Hello" 

选用专门为多播指定的D类IP地址(224.0.0.1到239.255.255.255),创建一个多播组 

InetAddress group = InetAddress.getByName("228.5.6.7") 

使用指定的端口(一般选1024以上的端口号)建立多播套接字 

MulticastSocket s = new MulticastSocket(6789) 

加入多播组 

s.joinGroup(group) 

创建一个数据报封装多播信息 

DatagramPacket hi = new DatagramPacket(msg.getBytes(), msg.length(), 

group, 6789) 

发送 

s.send(hi) 

接收多播信息的步骤 

开辟接收缓冲区 

byte[] buf = new byte[1000] 

创建接收数据报 

DatagramPacket recv = new DatagramPacket(buf, buf.length) 

接收 

s.receive(recv) 

注意:以上发送和接收程序在同一个文件中实现,若在不同文件中实现则应分别定义多播套接字并加入多播组。 

3.与已知IP和端口的端点通信 

在互联网上主要采用TCP和UDP来实现两点之间的通信。采用TCP可可靠传送信息,但花费时间较多;采用UDP可快速传递信息,但不能保证可靠传递。

JAVA实现TCP通信的方法 :

利用Socket(InetAddress addr, int port)和 Socket(String host, int port),创建客户端套接字,利用ServerSocket(int port)创建服务器端套接字,port端口就是服务器监听连接请求的端口,通过调用accept()返回一个最近创建的Socket对象,该Socket对象绑定了客户程序的IP地址或端口号。通过调用Socket的 getInputStream()方法获得输入流读传送来的信息,也可能通过调用Socket的 getOutputStream()方法获得输出流来发送消息。 

 

JAVA实现UDP通信的方法 :

使用DatagramPacket(byte [] buffer, int length, InetAddress addr, int port) 确定数据包数组、数组的长度、数据包的地址和端口信息。使用DatagramSocket()创建客户端套接字,而服务器端则采用DatagramSocket(int port),调用send(DatagramPacket dgp)和 receive(DatagramPacket dgp)来发送和接收数据包。本文设计的程序采用UDP。

P2P(Peer-to-Peer 端到端)模型是与C/S(客户/服务器)模型相对应。基于C/S的用户间通信需要由服务器中转,在C/S中的服务器故障将导致整个网络通信的瘫痪。。而基于P2P的用户间通信则是直接通信,去掉了服务器这一层,带来的显著优点是通信时没有单一的失败点,一个用户的故障不会影响整个P2P网络。本文提供了一种用JAVA实现P2P网络通信的方法。