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

TCP怎么实现P2P打洞_百度知道
TCP怎么实现P2P打洞
我有更好的答案
一般局域网使用了NAT(网络地址转换技术)和防火墙。P2P穿越NAT和防火墙主要有两种技术:称为打洞的UDP Punch技术和利用NAT设备管理接口的UPnP技术。一般使用UDP Punch技术,它实现起来简单一点。TCP实现起来比较复杂。关于这两种技术实现细节你可以查找相关书籍进行深入了解。
VpnVip资讯教程,软件使用平台。
操作系统/系统故障
为您推荐:
其他类似问题
您可能关注的内容
p2p的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。如何使用java实现tcp的p2p的打洞技术? - 知乎有问题,上知乎。知乎作为中文互联网最大的知识分享平台,以「知识连接一切」为愿景,致力于构建一个人人都可以便捷接入的知识分享网络,让人们便捷地与世界分享知识、经验和见解,发现更大的世界。5被浏览<strong class="NumberBoard-itemValue" title="分享邀请回答赞同 添加评论分享收藏感谢收起赞同 添加评论分享收藏感谢收起写回答实现TCP的P2P打洞C语言源代码_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&10W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
实现TCP的P2P打洞C语言源代码
&&TCPIP 网络通信
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
&#xe64e;加入VIP
还剩6页未读,
定制HR最喜欢的简历
你可能喜欢  在上一小节中了解到了通过浏览器自带的Webrtc功能来实现P2P视频聊天。在HTML5还没有普及和制定Webrtc标准的前提下,如果要在手机里进行视频实时对话等包括其他功能的话,还是要自己实现,还比较好扩展。所以本次要了解一下udp进行穿透(打洞)。
还是进入正题吧,了解P2P。
  关于原理网上随便就可以找到好多资料了。大部分都是讲解原理的,还配了图,还是不错的。这里不细说。
2. 代码讲解
  本次使用Java语言。网络框架使用Netty4, 其实这些都是次要的,原理看懂才是关键。
服务器代码EchoServer.java
1 package com.jieli.nat.
3 import io.netty.bootstrap.B
4 import io.netty.channel.ChannelO
5 import io.netty.channel.EventLoopG
6 import io.netty.channel.nio.NioEventLoopG
7 import io.netty.channel.socket.nio.NioDatagramC
9 public class EchoServer {
public static void main(String[] args) {
Bootstrap b = new Bootstrap();
EventLoopGroup group = new NioEventLoopGroup();
b.group(group)
.channel(NioDatagramChannel.class)
.option(ChannelOption.SO_BROADCAST, true)
.handler(new EchoServerHandler());
b.bind(7402).sync().channel().closeFuture().await();
} catch (Exception e) {
e.printStackTrace();
} finally{
group.shutdownGracefully();
服务器代码EchoServerHandler.java
1 package com.jieli.nat.
3 import java.net.InetA
4 import java.net.InetSocketA
6 import io.netty.buffer.ByteB
7 import io.netty.buffer.U
8 import io.netty.channel.ChannelHandlerC
9 import io.netty.channel.SimpleChannelInboundH
10 import io.netty.channel.socket.DatagramP
12 public class EchoServerHandler extends SimpleChannelInboundHandler&DatagramPacket&{
boolean flag = false;
InetSocketAddress addr1 = null;
InetSocketAddress addr2 = null;
* channelRead0 是对每个发送过来的UDP包进行处理
protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket packet)
throws Exception {
ByteBuf buf = (ByteBuf) packet.copy().content();
byte[] req = new byte[buf.readableBytes()];
buf.readBytes(req);
String str = new String(req, "UTF-8");
if(str.equalsIgnoreCase("L")){
//保存到addr1中 并发送addr2
addr1 = packet.sender();
System.out.println("L 命令, 保存到addr1中 ");
}else if(str.equalsIgnoreCase("R")){
//保存到addr2中 并发送addr1
addr2 = packet.sender();
System.out.println("R 命令, 保存到addr2中 ");
}else if(str.equalsIgnoreCase("M")){
//addr1 -& addr2
String remot = "A " + addr2.getAddress().toString().replace("/", "")
+" "+addr2.getPort();
ctx.writeAndFlush(new DatagramPacket(
Unpooled.copiedBuffer(remot.getBytes()), addr1));
//addr2 -& addr1
remot = "A " + addr1.getAddress().toString().replace("/", "")
+" "+addr1.getPort();
ctx.writeAndFlush(new DatagramPacket(
Unpooled.copiedBuffer(remot.getBytes()), addr2));
System.out.println("M 命令");
public void channelActive(ChannelHandlerContext ctx) throws Exception {
System.out.println("服务器启动...");
super.channelActive(ctx);
左边客户端EchoClient.java
1 package com.jieli.nat.
3 import io.netty.bootstrap.B
4 import io.netty.channel.ChannelO
5 import io.netty.channel.EventLoopG
6 import io.netty.channel.nio.NioEventLoopG
7 import io.netty.channel.socket.nio.NioDatagramC
* 模拟P2P客户端
14 public class EchoClient{
public static void main(String[] args) {
int port = 7778;
if(args.length != 0){
port = Integer.parseInt(args[0]);
Bootstrap b = new Bootstrap();
EventLoopGroup group = new NioEventLoopGroup();
b.group(group)
.channel(NioDatagramChannel.class)
.option(ChannelOption.SO_BROADCAST, true)
.handler(new EchoClientHandler());
b.bind(port).sync().channel().closeFuture().await();
} catch (Exception e) {
e.printStackTrace();
} finally{
group.shutdownGracefully();
左边客户端EchoClientHandler.java
1 package com.jieli.nat.
3 import java.net.InetSocketA
4 import java.util.V
6 import io.netty.buffer.ByteB
7 import io.netty.buffer.U
8 import io.netty.channel.ChannelHandlerC
9 import io.netty.channel.SimpleChannelInboundH
10 import io.netty.channel.socket.DatagramP
13 public class EchoClientHandler extends SimpleChannelInboundHandler&DatagramPacket&{
protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket packet)
throws Exception {
//服务器推送对方IP和PORT
ByteBuf buf = (ByteBuf) packet.copy().content();
byte[] req = new byte[buf.readableBytes()];
buf.readBytes(req);
String str = new String(req, "UTF-8");
String[] list = str.split(" ");
//如果是A 则发送
if(list[0].equals("A")){
String ip = list[1];
String port = list[2];
ctx.writeAndFlush(new DatagramPacket(
Unpooled.copiedBuffer("打洞信息".getBytes()), new InetSocketAddress(ip, Integer.parseInt(port))));
Thread.sleep(1000);
ctx.writeAndFlush(new DatagramPacket(
Unpooled.copiedBuffer("P2P info..".getBytes()), new InetSocketAddress(ip, Integer.parseInt(port))));
System.out.println("接收到的信息:" + str);
public void channelActive(ChannelHandlerContext ctx) throws Exception {
System.out.println("客户端向服务器发送自己的IP和PORT");
ctx.writeAndFlush(new DatagramPacket(
Unpooled.copiedBuffer("L".getBytes()),
new InetSocketAddress("183.1.1.1", 7402)));
super.channelActive(ctx);
右边客户端EchoClient2.java
1 package com.jieli.nat.
3 import io.netty.bootstrap.B
4 import io.netty.channel.ChannelO
5 import io.netty.channel.EventLoopG
6 import io.netty.channel.nio.NioEventLoopG
7 import io.netty.channel.socket.nio.NioDatagramC
* 模拟P2P客户端
14 public class EchoClient2{
public static void main(String[] args) {
Bootstrap b = new Bootstrap();
EventLoopGroup group = new NioEventLoopGroup();
b.group(group)
.channel(NioDatagramChannel.class)
.option(ChannelOption.SO_BROADCAST, true)
.handler(new EchoClientHandler2());
b.bind(7779).sync().channel().closeFuture().await();
} catch (Exception e) {
e.printStackTrace();
} finally{
group.shutdownGracefully();
右边客户端EchoClientHandler2.java
1 package com.jieli.nat.
3 import java.net.InetSocketA
4 import java.util.V
6 import io.netty.buffer.ByteB
7 import io.netty.buffer.U
8 import io.netty.channel.ChannelHandlerC
9 import io.netty.channel.SimpleChannelInboundH
10 import io.netty.channel.socket.DatagramP
12 public class EchoClientHandler2 extends SimpleChannelInboundHandler&DatagramPacket&{
protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket packet)
throws Exception {
//服务器推送对方IP和PORT
ByteBuf buf = (ByteBuf) packet.copy().content();
byte[] req = new byte[buf.readableBytes()];
buf.readBytes(req);
String str = new String(req, "UTF-8");
String[] list = str.split(" ");
//如果是A 则发送
if(list[0].equals("A")){
String ip = list[1];
String port = list[2];
ctx.writeAndFlush(new DatagramPacket(
Unpooled.copiedBuffer("打洞信息".getBytes()), new InetSocketAddress(ip, Integer.parseInt(port))));
Thread.sleep(1000);
ctx.writeAndFlush(new DatagramPacket(
Unpooled.copiedBuffer("P2P info..".getBytes()), new InetSocketAddress(ip, Integer.parseInt(port))));
System.out.println("接收到的信息:" + str);
public void channelActive(ChannelHandlerContext ctx) throws Exception {
System.out.println("客户端向服务器发送自己的IP和PORT");
ctx.writeAndFlush(new DatagramPacket(
Unpooled.copiedBuffer("R".getBytes()),
new InetSocketAddress("", 7402)));
super.channelActive(ctx);
3. 实验环境模拟
实验环境:1台本地主机L,里面安装虚拟机L,地址192.168.182.129. 通过路由器183.1.1.54上网。 1台服务器主机S,服务器地址183.1.1.52:7402, 同时服务器里安装虚拟机R,地址10.0.2.15 .由于外网地址只有两个,所以这能这样测试。通过虚拟机也是可以模拟出测试环境的。 &图示如下:
三台测试机ip如下
三台测试机器分别启动
然后通过第三方工具发送一个M指定到服务器
一般路由器的缓存会保存一小段时间,具体跟路由器有关。
关于Client R会少接收到一个"打洞消息"这个信息。不是因为UDP的丢包,是Client L 发送的打洞命令。简单说一下。一开始ClientL发送一个UDP到Server,此时ClientL的路由器会保留这样的一条记录(ClientL:IP:Port-&Server:IP:Port) 所以Server:IP:Port发送过来的信息,ClientL路由器没有进行拦截,所以可以接收得到。但是ClientR:IP:Port发送过来的消息在ClientL的路由器上是没有这一条记录的,所以会被拒绝。此时ClientL主动发送一条打洞消息(ClientL:IP:Port-&ClientR:IP:Port), 使ClientL路由器保存一条记录。使ClientR可以通过指定的IP:Port发送信息过来。不过ClientL的这条打洞信息就不一定能准确的发送到ClientR。原因就是,同理,ClientR路由器上没有ClientL的记录。
由于ClientL ClientR路由器上都没有双方的IP:port,所以通过这样的打洞过程。
我觉得我这样描述还是比较难懂的。如果还不了解,请另外参考其他网上资料。
还有一个就是搭建这样的测试环境还是比较麻烦的。注意如果你只有一台电脑,然后搭建成下面这种测试环境,一般是不行的。因为ClientL和ClientR是通过183.1.1.52路由器进行数据的P2P传输,一般路由器会拒绝掉这种回路的UDP包。
这个时候就要进行内网的穿透了。这个就要像我上一篇博客里面的Webrtc是如何通信一样的了,要通过信令来交换双方信息。
就是发送包括自己内网的所有IP,支持TCPUDP等其他信息封装成信令发送到服务器然后转发到另一端的客户端。使客户端可以对多个IP:Port进行尝试性连接。这个具体的就不展开了。
4.多说两句
  最近智能家具比较火,其中有一类网络摄像头。也是我们公司准备做的一款产品。我简单做了一下前期的预研。目前的一些传统的行业所做的网络摄像头,大部分是基于局域网的网络摄像头,就是只能在自家的路由器上通过手机查看。这类产品,我觉得很难进入普通家庭,因为普通家庭也就那么不到100平方的房子,这种网络摄像头的就体现不是很好了。与普通的监控就是解决了布线的问题了。其他到没有什么提升。
  还有一类是互联网行业做的网络摄像头。小米、360、百度等都有做这类型的网络摄像头。这类型的公司靠自己强大的云存储能力来实现。对这几个产品做了简单的了解,它们是支持本地存储,同时复制一份到云盘上。然后移动端(手机)是通过访问云盘里面的视频来实现监控的。这样虽然有一小段时间的延时,但是这样的效果还是不错的。你想,在监控某个地方,摄像头区域一般画面是不会发生太大的变化的,一个小时里面也就那么几个画面是要看到的。假使一段15分钟的视频,经过分析,得到下面这样。
  然后拖动到高亮的滑动条,高亮的地方,表示视频画面变动较大。这样就比较有针对性,也方便了客户了。还有重要的一点放在网盘,随时随地可以查看。但是也有一点就是隐私问题比较麻烦。其他的还有很多就不展开说明了。
  作为一个小厂,同时作为一名小兵,暂时还不知道公司要做哪种类型的,上级只是让我了解点对点穿透。我猜应该是在家里有个摄像头监控,数据保存在本地。网络部分是移动端发起连接到摄像头,实行点对点的实时监控和读取摄像头本地存储的视频回放,全程只是经过服务器进行命令控制。视频走P2P(走不通应该是转发,这个还不知道。会不会提示当前网络不支持这种提示啊?期待!!毕竟如果转发视频的话很麻烦,很占资源),视频保存本地。我猜目前公司应该是做成这个样子的。(公司非互联网公司,没有那么好的*aaS平台)
本文地址:&http://www.cnblogs.com/wunaozai/p/5545150.html&
阅读(...) 评论()&>&TCP实现P2P通信、TCP穿越NAT的方法、TCP打洞
TCP实现P2P通信、TCP穿越NAT的方法、TCP打洞
上传大小:82KB
TCP实现P2P通信、TCP穿越NAT的方法、TCP打洞
综合评分:4
{%username%}回复{%com_username%}{%time%}\
/*点击出现回复框*/
$(".respond_btn").on("click", function (e) {
$(this).parents(".rightLi").children(".respond_box").show();
e.stopPropagation();
$(".cancel_res").on("click", function (e) {
$(this).parents(".res_b").siblings(".res_area").val("");
$(this).parents(".respond_box").hide();
e.stopPropagation();
/*删除评论*/
$(".del_comment_c").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_invalid/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parents(".conLi").remove();
alert(data.msg);
$(".res_btn").click(function (e) {
var parentWrap = $(this).parents(".respond_box"),
q = parentWrap.find(".form1").serializeArray(),
resStr = $.trim(parentWrap.find(".res_area_r").val());
console.log(q);
//var res_area_r = $.trim($(".res_area_r").val());
if (resStr == '') {
$(".res_text").css({color: "red"});
$.post("/index.php/comment/do_comment_reply/", q,
function (data) {
if (data.succ == 1) {
var $target,
evt = e || window.
$target = $(evt.target || evt.srcElement);
var $dd = $target.parents('dd');
var $wrapReply = $dd.find('.respond_box');
console.log($wrapReply);
//var mess = $(".res_area_r").val();
var mess = resS
var str = str.replace(/{%header%}/g, data.header)
.replace(/{%href%}/g, 'http://' + window.location.host + '/user/' + data.username)
.replace(/{%username%}/g, data.username)
.replace(/{%com_username%}/g, data.com_username)
.replace(/{%time%}/g, data.time)
.replace(/{%id%}/g, data.id)
.replace(/{%mess%}/g, mess);
$dd.after(str);
$(".respond_box").hide();
$(".res_area_r").val("");
$(".res_area").val("");
$wrapReply.hide();
alert(data.msg);
}, "json");
/*删除回复*/
$(".rightLi").on("click", '.del_comment_r', function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_comment_del/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parent().parent().parent().parent().parent().remove();
$(e.target).parents('.res_list').remove()
alert(data.msg);
//填充回复
function KeyP(v) {
var parentWrap = $(v).parents(".respond_box");
parentWrap.find(".res_area_r").val($.trim(parentWrap.find(".res_area").val()));
评论共有15条
参考下,有些打不通
挺不错的,值得参考
还可以~可以参考
VIP会员动态
CSDN下载频道资源及相关规则调整公告V11.10
下载频道用户反馈专区
下载频道积分规则调整V1710.18
spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip
资源所需积分/C币
当前拥有积分
当前拥有C币
输入下载码
为了良好体验,不建议使用迅雷下载
TCP实现P2P通信、TCP穿越NAT的方法、TCP打洞
会员到期时间:
剩余下载个数:
剩余积分:0
为了良好体验,不建议使用迅雷下载
积分不足!
资源所需积分/C币
当前拥有积分
您可以选择
程序员的必选
绿色安全资源
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
您的积分不足,将扣除 10 C币
为了良好体验,不建议使用迅雷下载
无法举报自己的资源
你当前的下载分为234。
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可返还被扣除的积分
被举报人:
guti_milan
请选择类型
资源无法下载 ( 404页面、下载失败、资源本身问题)
资源无法使用 (文件损坏、内容缺失、题文不符)
侵犯版权资源 (侵犯公司或个人版权)
虚假资源 (恶意欺诈、刷分资源)
含色情、危害国家安全内容
含广告、木马病毒资源
*投诉人姓名:
*投诉人联系方式:
*版权证明:
*详细原因:
TCP实现P2P通信、TCP穿越NAT的方法、TCP打洞}

我要回帖

更多关于 java实现tcp三次握手 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信