用UDP穿透NAT可以解决P2P软件中的两个通过NAT上网的客户端直接通信的问题。
需要一个中介来帮助找到对方。
Java代码如下:
UDPAgent.java:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.util.regex.Pattern;
public class UDPAgent implements Runnable {
public static void main(String[] args) throws Exception {
new UDPAgent(-1).start();
}
DatagramSocket ds;
byte[] recbuf = new byte[1024];
DatagramPacket rec = new DatagramPacket(recbuf, recbuf.length);
static String ipPattern = "([0-9]{1,3}.){3}[0-9]{1,3}";
static String portPattern = "[0-9]{1,5}";
static Pattern sendPattern = Pattern.compile("send " + ipPattern + " "
+ portPattern + " .*");
int port;
public UDPAgent(int port) {
this.port = port;
}
public void init() throws Exception {
if (port < 1024 || port > 655535) {
ds = new DatagramSocket();
} else {
ds = new DatagramSocket(port);
}
}
public void start() throws Exception {
println("start");
println("LocalPort:" + port);
init();
new Thread(this).start();// recive thread
receive();
}
public void receive() {
for (;;) {
try {
ds.receive(rec);
String msg = new String(rec.getData(), rec.getOffset(), rec
.getLength());
String line = rec.getSocketAddress() + ":" + msg;
println(line);
onReceive(rec);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void onReceive(DatagramPacket rec) {
}
public void doCommand(String cmd) throws Exception {
// command:
// 1. send xxx.xxx.xxx.xxx xxx *******************
if (sendPattern.matcher(cmd).matches()) {
doSend(cmd);
}
}
public void doSend(String cmd) throws Exception {
println("CMD: " + cmd);
String[] s = cmd.split(" ", 4);
int port = Integer.parseInt(s[2]);
InetSocketAddress target = new InetSocketAddress(s[1], port);
byte[] bs = s[3].getBytes();
doSend(target, bs);
}
public void doSend(SocketAddress addr, byte[] data) throws Exception {
DatagramPacket pack = new DatagramPacket(data, data.length, addr);
ds.send(pack);
}
public void run() {
BufferedReader reader = new BufferedReader(new InputStreamReader(
System.in));
try {
String line = reader.readLine();
while (!"exit".equals(line)) {
doCommand(line);
line = reader.readLine();
}
System.exit(0);
} catch (Exception e) {
e.printStackTrace();
}
}
public void println(String s) {
System.out.println(System.currentTimeMillis() + ":" + s);
}
}
UDPClient.java
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
public class UDPClient extends UDPAgent {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
new UDPClient("www.javadoc.cn", 2008, -1).start();
}
String serverName;
int serverPort;
SocketAddress server;
public UDPClient(String host, int port, int localPort) {
super(localPort);
this.server = new InetSocketAddress(host, port);
}
public void start() throws Exception {
println("start");
init();
register();
new Thread(this).start();// recive thread
receive();
}
public void onReceive(DatagramPacket rec) {
try {
report(rec);
if (rec.getSocketAddress().equals(server)) {
doCommand(new String(rec.getData(), rec.getOffset(), rec
.getLength()));
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void report(DatagramPacket rec) throws Exception {
String s = rec.getSocketAddress()
+ new String(rec.getData(), rec.getOffset(), rec.getLength());
byte[] buf = s.getBytes();
ds.send(new DatagramPacket(buf, buf.length, server));
}
public void register() throws Exception {
String msg = "register " + getLocalAddress() + " " + ds.getLocalPort();
doSend(server, msg.getBytes());
}
public String getLocalAddress() throws Exception {
InetAddress addr = InetAddress.getLocalHost();
return addr.getHostAddress();
}
}
UDPServer.java
public class UDPServer extends UDPAgent {
public static void main(String[] args) throws Exception {
new UDPServer(2008).start();
}
public UDPServer(int port) {
super(port);
}
}
1。启动一个Server.
2。启动两个Client.
然后从Server端的Console里边可以看到两个Client的NAT后的地址和端口。
在Server段输入命令 send a.a.a.a A send b.b.b.b B hello
a.a.a.a是第一个Client的NAT后的ip,A端口号。
b是第二个。。。
输入这个命令后,A就会直接发给B一个 hello。 发送成功。 如果是同一个NAT后边,可能要让A发送到B的内网地址才能成功。
分享到:
相关推荐
本书分为3个部分:基础原理、P2P技术关键问题和系统设计与实现。基础理论部分介绍P2P网络的基本概念、网络结构、主流P2P应用系统架构,使读者掌握P2P相关基础理论。P2P技术关键问题部分论述了网络穿越、安全通信等...
本课题讨论并研究的主要问题是,分析研究P2P技术及该技术下流媒体数据传输的应用,设计并实现一个基于P2P技术的传输服务系统。通过搭建P2P传输平台,研究流媒体数据的实时高效传输。1.研究P2P传输技术的相关理论,...
目前模拟(Simulation)在Peer-to-Peer(P2P)系统的评估和分析中发挥着重要作用。很多研究者认为底层网络布局对P2P 系统性能有较大的影响,但现有的模拟器多基于不考虑底层网络的简单模型。同时多数模拟器仅支持...
C++_p2p实现多线程文件传输.docC++_p2p实现多线程文件传输.docC++_p2p实现多线程文件传输.docC++_p2p实现多线程文件传输.docC++_p2p实现多线程文件传输.docC++_p2p实现多线程文件传输.docC++_p2p实现多线程文件传输....
主要内容包括P2P概述、P2P网络拓扑结构、P2P网络搜索技术、P2P关键技术及应用、P2P网络中的nat穿透技术、基于P2P的bittorrent(后文简称bt)技术、基于P2P的emule文件共享技术、基于P2P的skype即时通信技术、基于P2P的...
基于p2p的网络流量分析技术剖析 为了解和掌握网络中P2P流量的特征,对网络中的P2P文件共享应用的流量进行了分 析。发现在P2P文件共享应用Maze产生的流量中:流量具有突发性特点;流量的局部性比WWW和 FTP应用相比更不...
p2p开发p2p开发p2p开发p2p开发p2p开发p2p开发p2p开发p2p开发
主要内容包括P2P概述、P2P网络拓扑结构、P2P网络搜索技术、P2P关键技术及应用、P2P网络中的nat穿透技术、基于P2P的bittorrent(后文简称bt)技术、基于P2P的emule文件共享技术、基于P2P的skype即时通信技术、基于P2P的...
摘 要: P2P(peer-to-peer)技术是未来重构分布式体系结构的关键技术,拥有广阔的应用前景.P2P系统的大多数问题都可归结为数据放置和检索问题,因此,P2P数据管理成为数据库领域活跃的研究课题.当前,P2P数据...
m3u8解析源码加速p2p视频解析,m3u8解析源码加速
基于java的p2p文件传输代码.rar基于java的p2p文件传输代码.rar基于java的p2p文件传输代码.rar基于java的p2p文件传输代码.rar基于java的p2p文件传输代码.rar基于java的p2p文件传输代码.rar基于java的p2p文件传输代码....
本文采用 B/S 体系结构来实现 P2P 网络借贷系统的设计,在技术上实现客户与后台管理员的交流模式,并建立安全可靠的 B/S 模式的网上借贷系统。本文通过对现有 P2P 网络借贷系统的模式进行分析,并采用 Spring Boot ...
计算机网络应用层 之 P2P 一、什么是P2P 对等网络(PeertoPeer,简称P2P)也称为对等连接,是一种新的通信模式,每个参与者具有同等的能力,可以发起一个通信会话。 这个定义有点抽象,下面就来简单地解释一下。粗略...
P2P终结者目前可以控制绝大部分流行的P2P软件下载,而且P2P终结者开发人员将持续跟踪最新的P2P下载技术的发展,在发现会对网络正常应用造成较大影响的网络下载技术时,会及时进行软件升级更新。 P2P终结者具有以下...
主要内容包括p2p概述、p2p网络拓扑结构、p2p网络搜索技术、p2p关键技术及应用、p2p网络中的nat穿透技术、基于p2p的bittorrent(后文简称bt)技术、基于p2p的emule文件共享技术、基于p2p的skype即时通信技术、基于p2p的...
P2P 技术解决了传统流媒体应用中的不能支持大用户的问题。而数据调度算法一直是P2P 研究中的热点问题。在给出了P2P 视频直播系统中节点能力的定义和计算方法后,结合BT 中的Rarest First 策略,提出了一种基于节点...
P2P终结者是一款网络管理软件,用来管理局域网中BT、电驴等大量占用带宽的下载软件,可以帮助您更好的管理您的局域网。它可以运行在Windows2000/XP/2003操作系统上。 P2P终结者是由Net.Soft工作室开发的一套专门...
P2P终结者是一款网络管理软件,用来管理局域网中BT、电驴等大量占用带宽的下载软件,可以帮助您更好的管理您的局域网。它可以运行在Windows2000/XP/2003操作系统上。 P2P终结者是由Net.Soft工作室开发的一套专门...