package socket.Stun.simple.ns.s;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketAddress;
import java.net.SocketException;
import java.util.Timer;
import java.util.TimerTask;
public class S {
/**
* @param args
* @throws IOException
*/
/**
* @param args
* @throws IOException
* @throws InterruptedException
*/
public static void main(String[] args) throws IOException,
InterruptedException {
final DatagramSocket udpsocket = new DatagramSocket(42000);
udpsocket.setReuseAddress(true);
System.out.println(" 等待NS注册和NC指令");
// 等待NS注册和NC指令
SocketAddress NSaddress = null;
boolean end = false;
try {
while (end == false) {
byte[] buf = new byte[1024];
DatagramPacket udp = new DatagramPacket(buf, buf.length);
udpsocket.receive(udp);
String msg = new String(udp.getData());
if (msg.startsWith("NS:")) {
NSaddress = udp.getSocketAddress();
System.out.println("收到来自NS" + NSaddress + "的注册");
System.out.println(new String(udp.getData()));
String respNS = "NS:" + udp.getAddress() + ":"
+ udp.getPort();
DatagramPacket repNSudp = new DatagramPacket(respNS
.getBytes(), respNS.getBytes().length, NSaddress);
udpsocket.send(repNSudp);
udpsocket.send(repNSudp);
udpsocket.send(repNSudp);
// 检测客户端保持活动
TimerTask checkNSalive = new TimerTask() {
@Override
public void run() {
try {
byte[] buf = new byte[1024];
DatagramPacket udp = new DatagramPacket(buf,buf.length);
udpsocket.receive(udp);
System.out.println("收到客户端用来保持连接存活的消息:"+new String(udp.getData()));
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
};
new Timer().schedule(checkNSalive, 0, 20 * 1000);
System.out.println("输入S->NS的消息");
BufferedReader localin = new BufferedReader(
new InputStreamReader(System.in));
respNS = null;
while (respNS == null) {
respNS = localin.readLine();
}
int moments = 6;
while (true) {
repNSudp = new DatagramPacket((respNS+":延迟"+moments+"分钟").getBytes(), (respNS+":延迟"+moments+"分钟")
.getBytes().length, NSaddress);
udpsocket.send(repNSudp);
udpsocket.send(repNSudp);
udpsocket.send(repNSudp);
Thread.sleep(60 * 1000 * moments);
moments+=1;
}
} else {
System.out.println(new String(udp.getData()));
}
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
package socket.Stun.simple.ns.s;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
import java.util.Timer;
import java.util.TimerTask;
public class NS {
/**
* @param args
* @throws IOException
*/
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
if(args.length<1){
System.out.println("usage: NS 172.16.253.123");
return;
}
String stunIp = args[0];
int stunPort = 42000;
final InetSocketAddress Saddress = new InetSocketAddress(stunIp, stunPort);
final DatagramSocket udpsocket = new DatagramSocket(42001);
udpsocket.setReuseAddress(true);
System.out.println("Sotimeout:"+udpsocket.getSoTimeout());
String outAddress = null;
String NSname = "NS:" ;
DatagramPacket udp = new DatagramPacket(NSname.getBytes(), NSname
.getBytes().length, Saddress);
udpsocket.send(udp);
udpsocket.send(udp);
udpsocket.send(udp);
while (true) {
byte[] buf = new byte[1024];
DatagramPacket reged = new DatagramPacket(buf, buf.length);
udpsocket.receive(reged);
System.out.println("收到消息。");
if(udp.getSocketAddress().equals(Saddress)){
System.out.println("\t收到S的消息。");
outAddress = new String(udp.getData());
if (outAddress.startsWith("NS:")) {
System.out.println("\t\t收到S确认注册的消息。");
outAddress = outAddress.substring(3);
break;
}
}
}
System.out.println("注册成功。外网地址为:" + outAddress);
// 2保持映射活动
TimerTask keepalive = new TimerTask() {
@Override
public void run() {
try {
DatagramPacket udp = new DatagramPacket("NS:hello S,"
.getBytes(), "hello S,".getBytes().length,
Saddress);
udpsocket.send(udp);
System.out.println("keepalive");
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
new Timer().schedule(keepalive, 0, 20 * 1000);
// 3等待指令S->NS
while (true) {
byte[] buf = new byte[1024];
udp = new DatagramPacket(buf, buf.length);
udpsocket.receive(udp);
if (udp.getSocketAddress().equals(Saddress)) {
System.out.println("收到" + udp.getSocketAddress() + "的数据:"
+ new String(udp.getData()));
String msg = new String(udp.getData());
System.out.println("S:"+msg);
}
}
}
}
分享到:
相关推荐
用Java实现的UDP穿透NAT技术,内有详细的注释,完全可以自己看懂的
第一个连接上服务器的客户端,称为client1,第二个连接上服务器的客户端称为client2 这个程序的功能是:先连接上服务器,根据服务器的返回决定它是client1还是client2, 若是client1,它就从服务器上得到client2的IP...
dotnet core UDP穿透内网客户端 非源码,但未加密 打洞实现 1、开一个云服务器,或自家的宽带,全主机映射。 2、云控制台上安全组udp打开相应的端口,打开防火墙上相应的端口。 3、两台客户端。。 4、A通过Udp...
P2P穿透NAT源代码,经过修改在delphi2007上可以正常编译运行。实现了udp Nat穿透,简单易懂
java 实现内网穿透,udp 打洞,NAT 穿透原理 1,客户端A登陆的时候,发送一个UDP数据包给服务器,然后服务器根据该包获得客户端A的IP和端口并保存到UdpAddressMap(用登录名作为key保存)中。 2,客户端A执行操作的...
在互联网终端急剧增长的今天,公网ip已经成为稀缺资源,对于国内垄断的电信运营商来讲,更是不可能随便免费给你...服务端是接收外部连接的,还需要客户端,将请求转发到内网服务器,为了实时知道有连接进来,客户端要和服务端
神卓互联是一款专为内网穿透而设计的软件,可以将内网服务器映射到公网上,使用户可以从外网访问内网资源。 神卓互联支持多种服务映射,包括HTTP、HTTPS、TCP和UDP等,且配置简单易用。使用神卓互联可以省去繁琐的...
Proxy是一个高性能的http代理、https代理、socks5代理、内网穿透代理服务器、游戏盾、游戏代理,支持API代理认证,高防服务器。支持正向代理、反向代理、透明代理、TCP和UDP内网穿透、HTTP和HTTPS内网穿透、https和...
frp是一个高性能的反向代理应用,可以轻松地进行内网穿透,对外网提供服务, 支持tcp, udp, http, https等协议类型,可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网
frp 是什么?...frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。 帮助文档 ...
最好用的内网穿透,神卓互联是一款专为内网穿透而设计的软件,可以将内网服务器映射到公网上,使用户可以从外网访问内网资源。 神卓互联支持多种服务映射,包括HTTP、HTTPS、TCP和UDP等,且配置简单易用。使用神卓...
frp内网穿透工具,附frp服务端、客户端自动拉起脚本。 支持TCP,UDP,HTTP,HTTPS等协议类型。 适用情况:实现内网服务通过端口映射的方式暴露在公网环境里。要求:有一台有公网IP的服务器。
frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议,且支持 P2P 通信。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网,俗称端口转发 为什么使用 ...
frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 协议,为 http 和 https 应用协议提供了额外的能力,且尝试性支持了点对点穿透。 frp 仍然处于开发阶段,未经充分测试与验证,不推荐用于生产环境...
它可以将外部网络请求转发到内网服务器,使得内网服务器可以被外部访问到。NPS支持TCP和UDP流量转发,并且可以支持任何TCP和UDP上层协议,例如访问内网网站、本地支付接口调试、SSH访问、远程桌面等。 为什么要使用...
最好用的企业级内网穿透软件,神卓互联是一款专为内网穿透而设计的软件,可以将内网服务器映射到公网上,使用户可以从外网访问内网资源。 神卓互联支持多种服务映射,包括HTTP、HTTPS、TCP和UDP等,且配置简单易用...
当我们能通过外网访问服务器A,但是我们并不能与位于内网的主机交互,这时reGeorg就派上了用场,假设此时我们拿到了服务器A的webshell,但是该内网主机的icmp、DNS、tcp和udp协议等都不能出网,唯一的数据通道是...
想和朋友联机玩游戏,下班了需要连接公司电脑,但是自己没有服务器,没有公网ip怎么办 本应用可以建立tcp、udp隧道,把本地或者远程应用端口映射出来,不要求有公网,如果双方节点无法进行直连,会有其它节点进行...
服务器:启动intermediary服务 B->服务器:告诉服务器B的名称 A->服务器:我需要链接B的xx端口(服务器获取NAT-A的端口ip) 服务器->B:NAT-A:端口需要和你链接并代理到ip:端口 B:启动一个UDP服务 B->NAT-A:udp send...
UDP内网NAT穿透java源码初步,A和B分别向服务器发送消息,服务器分别向A和B发送对方的IP和端口