`
me-
  • 浏览: 69445 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

udp 穿透,内网服务器,已测原理代码。

阅读更多
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技术

    用Java实现的UDP穿透NAT技术,内有详细的注释,完全可以自己看懂的

    udp内网穿透实战例子.zip

    第一个连接上服务器的客户端,称为client1,第二个连接上服务器的客户端称为client2 这个程序的功能是:先连接上服务器,根据服务器的返回决定它是client1还是client2, 若是client1,它就从服务器上得到client2的IP...

    udp穿透客户端.zip

    dotnet core UDP穿透内网客户端 非源码,但未加密 打洞实现 1、开一个云服务器,或自家的宽带,全主机映射。 2、云控制台上安全组udp打开相应的端口,打开防火墙上相应的端口。 3、两台客户端。。 4、A通过Udp...

    P2P穿透NAT源代码 delphi2007

    P2P穿透NAT源代码,经过修改在delphi2007上可以正常编译运行。实现了udp Nat穿透,简单易懂

    java 实现内网穿透,udp 打洞,NATjavaUdpP2P.rar

    java 实现内网穿透,udp 打洞,NAT 穿透原理 1,客户端A登陆的时候,发送一个UDP数据包给服务器,然后服务器根据该包获得客户端A的IP和端口并保存到UdpAddressMap(用登录名作为key保存)中。 2,客户端A执行操作的...

    sunny-ngrok for thinkphp 内网穿透库.rar

    在互联网终端急剧增长的今天,公网ip已经成为稀缺资源,对于国内垄断的电信运营商来讲,更是不可能随便免费给你...服务端是接收外部连接的,还需要客户端,将请求转发到内网服务器,为了实时知道有连接进来,客户端要和服务端

    神卓互联内网穿透客户端8.8.5企业版

    神卓互联是一款专为内网穿透而设计的软件,可以将内网服务器映射到公网上,使用户可以从外网访问内网资源。 神卓互联支持多种服务映射,包括HTTP、HTTPS、TCP和UDP等,且配置简单易用。使用神卓互联可以省去繁琐的...

    GoProxy是一款轻量级、功能强大、高性能的http代理、socks5代理、内网穿透代理服务器支持API代理认证,高防服务器

    Proxy是一个高性能的http代理、https代理、socks5代理、内网穿透代理服务器、游戏盾、游戏代理,支持API代理认证,高防服务器。支持正向代理、反向代理、透明代理、TCP和UDP内网穿透、HTTP和HTTPS内网穿透、https和...

    frp软件包 用来搭建内网穿透服务器

    frp是一个高性能的反向代理应用,可以轻松地进行内网穿透,对外网提供服务, 支持tcp, udp, http, https等协议类型,可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网

    内网穿透FRP工具 windows 客户端和服务端 V0.46

    frp 是什么?...frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。 帮助文档 ...

    最新内网穿透 神卓互联 8.9.2客户端

    最好用的内网穿透,神卓互联是一款专为内网穿透而设计的软件,可以将内网服务器映射到公网上,使用户可以从外网访问内网资源。 神卓互联支持多种服务映射,包括HTTP、HTTPS、TCP和UDP等,且配置简单易用。使用神卓...

    frp内网穿透工具,附自动拉起脚本

    frp内网穿透工具,附frp服务端、客户端自动拉起脚本。 支持TCP,UDP,HTTP,HTTPS等协议类型。 适用情况:实现内网服务通过端口映射的方式暴露在公网环境里。要求:有一台有公网IP的服务器。

    windows本地与云端服务器进行SSH与frp内网穿透.pdf

    frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议,且支持 P2P 通信。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网,俗称端口转发 为什么使用 ...

    frp内网穿透.md

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 协议,为 http 和 https 应用协议提供了额外的能力,且尝试性支持了点对点穿透。 frp 仍然处于开发阶段,未经充分测试与验证,不推荐用于生产环境...

    比frp还简单易用的内网穿透工具

    它可以将外部网络请求转发到内网服务器,使得内网服务器可以被外部访问到。NPS支持TCP和UDP流量转发,并且可以支持任何TCP和UDP上层协议,例如访问内网网站、本地支付接口调试、SSH访问、远程桌面等。 为什么要使用...

    神卓互联企业级内网穿透,9.0.4最新版

    最好用的企业级内网穿透软件,神卓互联是一款专为内网穿透而设计的软件,可以将内网服务器映射到公网上,使用户可以从外网访问内网资源。 神卓互联支持多种服务映射,包括HTTP、HTTPS、TCP和UDP等,且配置简单易用...

    流量代理之reGeorg内网穿透工具包.zip

    当我们能通过外网访问服务器A,但是我们并不能与位于内网的主机交互,这时reGeorg就派上了用场,假设此时我们拿到了服务器A的webshell,但是该内网主机的icmp、DNS、tcp和udp协议等都不能出网,唯一的数据通道是...

    p2ptunnel:一个基于p2p的tcp、udp内网穿透隧道工具

    想和朋友联机玩游戏,下班了需要连接公司电脑,但是自己没有服务器,没有公网ip怎么办 本应用可以建立tcp、udp隧道,把本地或者远程应用端口映射出来,不要求有公网,如果双方节点无法进行直连,会有其它节点进行...

    go-nat-hole:解决外网向内网p2p通信方案--NAT穿透

    服务器:启动intermediary服务 B-&gt;服务器:告诉服务器B的名称 A-&gt;服务器:我需要链接B的xx端口(服务器获取NAT-A的端口ip) 服务器-&gt;B:NAT-A:端口需要和你链接并代理到ip:端口 B:启动一个UDP服务 B-&gt;NAT-A:udp send...

    NAT穿透java

    UDP内网NAT穿透java源码初步,A和B分别向服务器发送消息,服务器分别向A和B发送对方的IP和端口

Global site tag (gtag.js) - Google Analytics