`
jxxms
  • 浏览: 104666 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论
阅读更多

用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的内网地址才能成功。

分享到:
评论

相关推荐

    P2P网络技术原理与系统开发案例

    本书分为3个部分:基础原理、P2P技术关键问题和系统设计与实现。基础理论部分介绍P2P网络的基本概念、网络结构、主流P2P应用系统架构,使读者掌握P2P相关基础理论。P2P技术关键问题部分论述了网络穿越、安全通信等...

    基于P2P的实时流媒体系统设计

    本课题讨论并研究的主要问题是,分析研究P2P技术及该技术下流媒体数据传输的应用,设计并实现一个基于P2P技术的传输服务系统。通过搭建P2P传输平台,研究流媒体数据的实时高效传输。1.研究P2P传输技术的相关理论,...

    基于NS2的P2P网络模拟平台研究

    目前模拟(Simulation)在Peer-to-Peer(P2P)系统的评估和分析中发挥着重要作用。很多研究者认为底层网络布局对P2P 系统性能有较大的影响,但现有的模拟器多基于不考虑底层网络的简单模型。同时多数模拟器仅支持...

    C++_p2p实现多线程文件传输.doc

    C++_p2p实现多线程文件传输.docC++_p2p实现多线程文件传输.docC++_p2p实现多线程文件传输.docC++_p2p实现多线程文件传输.docC++_p2p实现多线程文件传输.docC++_p2p实现多线程文件传输.docC++_p2p实现多线程文件传输....

    P2P技术揭秘-管磊

    主要内容包括P2P概述、P2P网络拓扑结构、P2P网络搜索技术、P2P关键技术及应用、P2P网络中的nat穿透技术、基于P2P的bittorrent(后文简称bt)技术、基于P2P的emule文件共享技术、基于P2P的skype即时通信技术、基于P2P的...

    基于p2p应用的流量分析

    基于p2p的网络流量分析技术剖析 为了解和掌握网络中P2P流量的特征,对网络中的P2P文件共享应用的流量进行了分 析。发现在P2P文件共享应用Maze产生的流量中:流量具有突发性特点;流量的局部性比WWW和 FTP应用相比更不...

    p2p开发p2p开发p2p开发p2p开发

    p2p开发p2p开发p2p开发p2p开发p2p开发p2p开发p2p开发p2p开发

    《P2P技术揭秘P2P网络技术原理与典型系统开发》(管磊 编著)

    主要内容包括P2P概述、P2P网络拓扑结构、P2P网络搜索技术、P2P关键技术及应用、P2P网络中的nat穿透技术、基于P2P的bittorrent(后文简称bt)技术、基于P2P的emule文件共享技术、基于P2P的skype即时通信技术、基于P2P的...

    P2P数据管理.pdf

    摘 要: P2P(peer-to-peer)技术是未来重构分布式体系结构的关键技术,拥有广阔的应用前景.P2P系统的大多数问题都可归结为数据放置和检索问题,因此,P2P数据管理成为数据库领域活跃的研究课题.当前,P2P数据...

    P2P版M3U8解析源码1.2.1版.zip_P2P解析m3u8源码_m3u8 p2p解析_p2p加速m3u8接口_p2p视频解

    m3u8解析源码加速p2p视频解析,m3u8解析源码加速

    基于java的p2p文件传输代码.rar

    基于java的p2p文件传输代码.rar基于java的p2p文件传输代码.rar基于java的p2p文件传输代码.rar基于java的p2p文件传输代码.rar基于java的p2p文件传输代码.rar基于java的p2p文件传输代码.rar基于java的p2p文件传输代码....

    基于SpringBoot框架对P2P借贷平台的设计与实现

    本文采用 B/S 体系结构来实现 P2P 网络借贷系统的设计,在技术上实现客户与后台管理员的交流模式,并建立安全可靠的 B/S 模式的网上借贷系统。本文通过对现有 P2P 网络借贷系统的模式进行分析,并采用 Spring Boot ...

    计算机网络应用层 之 P2P

    计算机网络应用层 之 P2P 一、什么是P2P 对等网络(PeertoPeer,简称P2P)也称为对等连接,是一种新的通信模式,每个参与者具有同等的能力,可以发起一个通信会话。 这个定义有点抽象,下面就来简单地解释一下。粗略...

    p2p终结者4.03

    P2P终结者目前可以控制绝大部分流行的P2P软件下载,而且P2P终结者开发人员将持续跟踪最新的P2P下载技术的发展,在发现会对网络正常应用造成较大影响的网络下载技术时,会及时进行软件升级更新。 P2P终结者具有以下...

    Java P2P技术内幕PDF+源代码

    主要内容包括p2p概述、p2p网络拓扑结构、p2p网络搜索技术、p2p关键技术及应用、p2p网络中的nat穿透技术、基于p2p的bittorrent(后文简称bt)技术、基于p2p的emule文件共享技术、基于p2p的skype即时通信技术、基于p2p的...

    P2P视频直播数据调度算法

    P2P 技术解决了传统流媒体应用中的不能支持大用户的问题。而数据调度算法一直是P2P 研究中的热点问题。在给出了P2P 视频直播系统中节点能力的定义和计算方法后,结合BT 中的Rarest First 策略,提出了一种基于节点...

    P2P终结者 4.14 

    P2P终结者是一款网络管理软件,用来管理局域网中BT、电驴等大量占用带宽的下载软件,可以帮助您更好的管理您的局域网。它可以运行在Windows2000/XP/2003操作系统上。 P2P终结者是由Net.Soft工作室开发的一套专门...

    P2P终结者 4.13

    P2P终结者是一款网络管理软件,用来管理局域网中BT、电驴等大量占用带宽的下载软件,可以帮助您更好的管理您的局域网。它可以运行在Windows2000/XP/2003操作系统上。 P2P终结者是由Net.Soft工作室开发的一套专门...

Global site tag (gtag.js) - Google Analytics