UDP打洞,内网穿透(附JAVA代码)

JAVA实现P2P内网穿透踩过的坑 p2p技术,又称为点对点(peer-to-peer),可以直接跨越NAT实现内网主机直接通讯。实现方式包括:中继(Relaying),逆向链接(Connection reversal), udp打洞(UDP hole punching)。中继方式是比较传统且效率较低的一种,不推荐使用,本人采用的是udp打洞,可以极大的降低服务器的压力,提高作业效率。 因为项目需要,开始研究起了p2p,之前对网络这... 阅读详情

目录

1.内网穿透概论

1.1 公网IP端口,NAT转发,内网IP端口之间的关系

1.2 NAT转发和UDP打洞原理

1.3 核心代码

1.内网穿透概论

        本人不喜欢长篇大论的讲一些学术用语,最后看的云里雾里的。就用最简单的白话文大概讲一下内网穿透的原理和作用。

1.1 公网IP端口,NAT转发,内网IP端口之间的关系

         要了解和使用内网穿透,首先要明白他们之间是如何交换消息的。

举个例子:在网页上输入www.baidu.com 就可以打开百度,这是因为知道了域名,域名在DNS服务器上映射到了对应的公网IP,域名是和ip地址绑定的,访问www.xxx.com 等于访问 公网IP,可以使用cmd的ping命令去看返回ip地址。

当我们访问了www.baidu.com ,百度的服务器需要知道你的公网ip和端口才能把信息返回给你(最终结果就是浏览器上显示百度页面)

        浏览器输入www.baidu.com到返回百度页面 整个过程的路径

        内网 IP:端口 -> nat(转发)网线的公网 IP:端口 -> 百度服务器公网 IP:端口 ->nat(转发) 网线的公网 IP:端口 -> 内网 IP:端口

其中 内网 和 nat(转发) 每一次请求都会刷新端口  , 内网IP(在cmd 中输入 ipconfig /all 可以查看的ipv4地址 ) 如下图:

 了解网络传输协议的应该都知道 互联网上进行信息传输 需要目标地址,端口和响应地址,端口

这里涉及到一个知识就是nat,因为ipv4地址是有限的,现在运营商的网线大部分是一个公网对应一个区域的用户,简单来说就是你和其他人一起使用一个公网ip。

nat起到一个转发作用,所以你在本地电脑上的地址和端口是不能被外网用户访问的,但是可以被同一个公网ip下的用户访问。可以这样理解一个公网ip对应一个nat。

那么为什么要进行udp打洞呢?因为需要和nat外用户进行信息交换。

前面的内容只是介绍一下大概,下面是重点(仔细看)

1.2 NAT转发和UDP打洞原理

        当两个内网A,B想要互相通信怎么办呢?首先需要知道A,B的nat地址和端口

每次发送信息到百度服务器返回的地址其实是nat的地址和端口,然后由nat转发给你的内网地址和端口并生成记录,记录类似于: (nat地址:端口——内网地址:端口)。 

nat地址端口和内网地址端口 1对1绑定了(可以画上等于号,每次调用端口都会刷新)

因为A,B都是内网,无法直接通信,所以需要一个公网服务器 来记录A,B的nat地址和端口。

然后让A向公网服务器的地址发UDP消息,这样A的NAT上就会留下一条记录 A IP:端口 ——natA 公网IP:端口。

让B向公网服务器的地址发UDP消息,这样B的NAT上就会留下一条记录 B IP:端口 ——natB公网IP:端口。

这样A,B的nat地址和端口都知道了,然后在让A,B互相发送UDP请求 在nat中留下记录 这样 A,B之间就可以通过UDP进行通信了。

重点!!!使用java new DatagramSocket() 一定要使用单例模式,千万不要关闭不然每次nat映射的端口都不一样 ,nat在变化就无法获取正确的地址了 之前踩坑过

1.3 核心代码

import com.alibaba.fastjson.JSON;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static spike.controller.CheckSyncStateController.doGet;

/**
 * @PACKAGE_NAME: spike.schedule
 * @NAME: NatSchedule
 * @USER: spike
 * @DATE: 2023/5/12 10:27
 * @PROJECT_NAME: Springcolud_Spike
 */
@Slf4j
@Component
public class NatSchedule {

    @Value("${tarurl}")
    private String TAR_URL;

    @Value("${isserver}")
    private boolean IS_SERVER;

    @Value("${key}")
    private String KEY;

    @Value("${sendport}")
    private Integer SEND_PORT;

    @Value("${receiveport}")
    private Integer RECEIVE_PORT;

    public static DatagramSocket RECEIVE_SOCKET = null;
    public static DatagramSocket SEND_SOCKET = null;

    public static Map<String, Object> NAT_MAP = new HashMap<>();

    //每1分钟执行一次
    @PostConstruct
    @Scheduled(cron = "0/60 * * * * ?")
    private void SendUdp() throws IOException {
        sendUpdMsg();
    }

    //每1秒钟执行一次
    @Scheduled(cron = "*/1 * * * * ?")
    private void receiveUpd() throws IOException {
        receiveUpdMsg();
    }

    public void sendUpdMsg() throws IOException {
        if (!IS_SERVER) {
            if (SEND_SOCKET == null) {
                //清除key值
                doGet("http://" + TAR_URL + "/Nat/clearNatMap?key=" + KEY);
                SEND_SOCKET = new DatagramSocket(SEND_PORT);
                Thread thread = new Thread() {
                    @SneakyThrows
                    @Override
                    public void run() {
                        log.info("开始接收upd请求");
                        responseSend();
                    }
                };
                thread.start();
            }
            sendUpdToServer();
        }
    }

    private void responseSend() throws IOException {
        byte[] bytes = new byte[1024];
        DatagramPacket packet1 = new DatagramPacket(bytes, bytes.length);
        while (true) {
            SEND_SOCKET.receive(packet1);
            String receive = new String(bytes, 0, packet1.getLength(), "utf-8");
            if (receive.contains("client")) {
                String msg = "****************************打洞成功****************************";
                log.info(msg);
            }else {
                log.info("*************************** upd信息开始 ***************************\n {}", receive);
                log.info("*************************** upd信息结束 ***************************");
            }
        }
    }

    private void sendUpdToServer() throws IOException {
        String ipV4 = InetAddress.getLocalHost().getHostAddress();
        String[] ipArr = TAR_URL.split(":");
        // 客户段发送upd请求到服务端(服务端记录 客户端内网ip/外网ip/外网端口)
        String text = KEY + ":" + ipV4 + ":" + SEND_SOCKET.getLocalPort();
        byte[] buf = text.getBytes();
        sendUdp(buf, ipArr[0], RECEIVE_PORT, SEND_SOCKET);
        //查询 相同key的两个客户段nat信息
        String result = doGet("http://" + TAR_URL + "/Nat/getNatMap?key=" + KEY);
        if (result.isEmpty()) {
            return;
        }
        List<String> list = JSON.parseObject(result, List.class);
        // 相同key 需要nat穿透的ip数组
        log.info("键值:{} 下穿透ip数组 {}", KEY, JSON.toJSONString(list));
        String client = "";
        for (String str : list) {
            if (str == null || str.isEmpty()) {
                continue;
            }
            String[] strArr = str.split(":");
            if (strArr[0].equals(ipV4)) {
                client = str;
            }
            if (!strArr[0].equals(ipV4)) {
                //upd打洞
                String[] udpArr = str.split("/")[1].split(":");
                // 2,明确要发送的具体数据。
                String clientMsg = "来自 client " + client + " upd 信息";
                byte[] data = clientMsg.getBytes();
                sendUdp(data, udpArr[0], Integer.valueOf(udpArr[1]), SEND_SOCKET);
            }
        }
    }

    public static void sendUdp(byte[] data, String ip, int port, DatagramSocket datagramSocket) throws IOException {
        // 3,将数据封装成了数据包。
        DatagramPacket packet = new DatagramPacket(data, data.length, InetAddress.getByName(ip), port);
        log.info("向服务端" + ip + ":" + port + "发送upd 信息");
        datagramSocket.send(packet);
    }

    /**
     * 服务端接收upd请求
     *
     * @throws IOException
     */
    public void receiveUpdMsg() throws IOException {
        if (IS_SERVER) {
            //创建一个数据包,用于接收数据
            byte[] bytes = new byte[1024];
            DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
            //DatagramSocket(int port)构造数据报套接字并将其绑定到本地主机上的指定端口
            if (RECEIVE_SOCKET == null) {
                RECEIVE_SOCKET = new DatagramSocket(RECEIVE_PORT);
            }
            DatagramSocket ds = RECEIVE_SOCKET;
            //调用DatagramSocket对象的方法接收数据
            ds.receive(dp);
            InetAddress address = dp.getAddress();
            int port = dp.getPort();
            String url = address.getHostAddress() + ":" + port;
            //解析数据包,并把数据在控制台显示
            byte[] data = dp.getData();
            //int getLength()返回要发送的数据的长度或接收到的数据的长度
            int length = dp.getLength();
            String dataString = new String(data, 0, length);
            log.info("\n客户端Nat地址:  **** {}**** \n客户端内网地址: **** {} **** ", url, dataString);
            String[] clientArr = dataString.split(":");
            if (IS_SERVER) {
                String key = clientArr[0];
                putNatMap(key, clientArr[1] + ":" + clientArr[2] + "/" + url);
                log.info("key :{} 映射数组更新完成", KEY);
            }
        }
    }

    private void putNatMap(String key, String value) {
        if (NAT_MAP.get(KEY) == null) {
            List<String> tempArr = new ArrayList<>();
            tempArr.add(value);
            NAT_MAP.put(key, tempArr);
        } else {
            List<String> tempArr = (List<String>) NAT_MAP.get(key);
            String refresh = null;
            for (String str : tempArr) {
                String uuid = StringUtils.substringBeforeLast(str, ":");
                String uuidValue = StringUtils.substringBeforeLast(value, ":");
                if (uuid.equals(uuidValue)) {
                    refresh = str;
                    break;
                }
            }
            if (refresh != null) {
                tempArr.remove(refresh);
            }
            tempArr.add(value);
            NAT_MAP.put(key, tempArr);
        }
    }
}

import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import spike.schedule.NatSchedule;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.DatagramSocket;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import static spike.schedule.NatSchedule.RECEIVE_SOCKET;
import static spike.schedule.NatSchedule.SEND_SOCKET;
import static spike.schedule.NatSchedule.sendUdp;

/**
 * @PACKAGE_NAME: com.example.controller
 * @NAME: CheckSyncState
 * @USER: spike
 * @DATE: 2023/5/8 8:57
 * @PROJECT_NAME: SendAlertMsg
 */
@Slf4j
@RestController
@RequestMapping("Nat")
public class CheckSyncStateController {
    @Value("${isserver}")
    private boolean IS_SERVER;

    /**
     * 查询NAT_MAP
     */
    @ApiOperation(value = "查询NAT_MAP", tags = "Nat Upd打洞")
    @RequestMapping(value = "/getNatMap", method = RequestMethod.GET)
    public Object getSyncState(@RequestParam(required = false, value = "key") String key) {
        if (!key.isEmpty()) {
            return NatSchedule.NAT_MAP.get(key);
        }
        return NatSchedule.NAT_MAP;
    }

    /**
     * 清除指定NAT_MAP key
     */
    @ApiOperation(value = "清除指定NAT_MAP key", tags = "Nat Upd打洞")
    @RequestMapping(value = "/clearNatMap", method = RequestMethod.GET)
    public Object clearNatMap(@RequestParam(required = false, value = "key") String key) {
        if (NatSchedule.NAT_MAP.get(key) != null) {
            NatSchedule.NAT_MAP.put(key, null);
            return NatSchedule.NAT_MAP.get(key);
        }
        return NatSchedule.NAT_MAP.get(key);
    }

  
    /**
     * 请求
     */
    @ApiOperation(value = "udp打洞", tags = "CheckSyncStateController 检查同步状态")
    @RequestMapping(value = "/sendToUdp", method = RequestMethod.GET)
    public String sendToUdp(@RequestParam(value = "key") String key, @RequestParam(value = "client_ip") String client_ip, @RequestParam(value = "client_port") Integer client_port) throws IOException {
        DatagramSocket datagramSocket;
        if (IS_SERVER) {
            datagramSocket = RECEIVE_SOCKET;
        } else {
            datagramSocket = SEND_SOCKET;
        }
        sendUdp(key.getBytes(), client_ip, client_port, datagramSocket);
        log.info("GET接口向服务端 {}:{} 发送upd 信息:{}", client_ip, client_port, key);
        return "打洞完成";
    }

    public static String doGet(String httpurl) {
        HttpURLConnection connection = null;
        InputStream is = null;
        BufferedReader br = null;
        String result = null;// 返回结果字符串
        try {
            // 创建远程url连接对象
            URL url = new URL(httpurl);
            // 通过远程url连接对象打开一个连接,强转成httpURLConnection类
            connection = (HttpURLConnection) url.openConnection();
            // 设置连接方式:get
            connection.setRequestMethod("GET");
            // 设置连接主机服务器的超时时间:15000毫秒
            connection.setConnectTimeout(15000);
            // 设置读取远程返回的数据时间:60000毫秒
            connection.setReadTimeout(60000);
            // 发送请求
            connection.connect();
            // 通过connection连接,获取输入流
            if (connection.getResponseCode() == 200) {
                is = connection.getInputStream();
                // 封装输入流is,并指定字符集
                br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
                // 存放数据
                StringBuffer sbf = new StringBuffer();
                String temp = null;
                while ((temp = br.readLine()) != null) {
                    sbf.append(temp);
                    sbf.append("\r\n");
                }
                result = sbf.toString();
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭资源
            if (null != br) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (null != is) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            connection.disconnect();// 关闭远程连接
        }

        return result;
    }

}
server:
  port: 5001
#服务端公网地址
tarurl: xx.xxx.xx.xxx:5001
#是否服务器
isserver: false
#客户端连接唯一键值
key: 自己定义一个uuid
sendport: 5001
receiveport : 7091

nat内网穿透获取连接服务器的map

http://服务器地址:5001/Nat/getNatMap?key=定义的唯一uuid

返回示例:

[

    "192.168.0.117:50979/x11.xx2.89.xx2:15623"

]

upd发送消息接口

http://内网IPV4:5001/Nat/sendToUdp?client_ip=目标公网ip&client_port=目标的nat端口&key=发送内容

返回示例:

打洞完成

结果展示:

 

Java实现的udp打洞demo Java实现的udp打洞demo、Java实现的udp打洞demo、Java实现的udp打洞demo、 立即下载

相关推荐

java udp 打洞例子(p2p)

java udp 打洞例子(p2p) .

如何实现UDP穿透

在讲解UDP穿透之前,首先我们需要先了解为何需要使用UDP穿透?需求是什么? 一、需求 在不公布IP和端口的情况下,让俩个局域网内的PC端建立连接。 二、环境 普通的家庭电脑(PC端)连接Internet(因特网)时,首先需要通过运营商(拨号)连接到Internet(下面统称外网)中的域名服务器,然后域名服务器会将你的请求转发到实机服务器上,从而实现内外网的连接。 在内网(局域网)中需要注意以下几点: 在同一时间段内,无论局域网中有几台联网设备,对于外网来说都是同一个临时IP。 在同一

Lavender的博客 9051

java udp p2p nat 等打洞技术实现通信,已测试成功

UDP打洞实现了子网间的穿透功能,首先在一台拥有公网IP服务器上运行server,在不同的两个子网PC上运行client,输入服务器IP,即可进行打洞,实现不同子网的通信。

Java实现内网穿透

1、当公司的一些系统功能使用了第三方服务时,通常第三方会回调我们的接口。在对接阶段,为了方便debug,我们肯定希望能回调到我们本地电脑上来。2、当你在公司想访问部署在家里电脑的服务或者文件时。3、当你的外地同事想访问你本地的服务,虽然发布到测试也可以,但是部署需要时间,发生错误排除也没有本地来的快,不够所见即所得。虽然有现成的内网穿透工具,但没有比自己写的用起来更有成就感,哈哈哈哈~

qq_41084438的博客 3713

Java实现UDP穿透NAT技术

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

udp.zip_ICE NAT_UDP nat java_nat_udp打洞_最新防火墙

就是非常有名的“UDP打洞技术”,UDP打洞技术依赖于由公共防火墙和cone NAT,允许适当的有计划的端对端应用程序通过NAT“打洞”,即使当双方的主机都处于NAT之后。这种技术在 RFC3027的5.1节[NAT PROT] 中进行了重点介绍,并且在Internet[KEGEL]中进行了非正式的描叙,还应用到了最新的一些协议,例如[TEREDO,ICE]协议中。不过,我们要注意的是,“术”如其名,UDP打洞技术的可靠性全都要依赖于UDP。

java udp打洞 源码,udp打洞附源码

打洞主要采用的是udp的无面向连接的特性来实现,同过user1连接server,打通user1的对外ip和端口,通过user2连接server,打通uer2对外的ip和端口,然后user1和user2通过彼此已经打通的对外ip和端口实现通讯,下面的测试程序,需要先启动服务器端,然后启动两个客户端,就可以看见效果方便他人亦是方便自己,如果觉得还行就点下赞吧,这样可以帮助其他人更快的找到解决问题的方法...

weixin_34245159的博客 271

Obsidian和Typora图片路径同步终极指南:告别混乱的assets文件夹

本文详细解析了Obsidian与Typora图片路径同步的终极解决方案,通过Custom Attachment Location插件实现动态路径管理,解决了两款工具间图片兼容性问题。文章提供了从基础配置到高级应用的完整指南,帮助用户告别混乱的assets文件夹,提升工作效率。

g9h0i1的博客 822

TCP打洞和UDP打洞的区别

为什么网上讲到的P2P打洞基本上都是基于UDP协议的打洞?难道TCP不可能打洞?还是TCP打洞难于实现? 假设现在有内网客户端A和内网客户端B,有公网服务端S。 如果A和B想要进行UDP通信,则必须穿透双方的NAT路由。假设为NAT-A和NAT-B。 A发送数据包到公网S,B发送数据包到公网S,则S分别得到了A和B的公网IP, S也和A B 分别建立了会话,由S发到NAT-A的数据包会被NAT-A直接转发给A, 由S发到NAT-B的数据包会被NAT-B直接转发给B,除了S发...

thlzjfefe的博客 873

别再只看pLDDT了!AlphaFold预测结果解读保姆级指南:pLDDT、PAE、pTM、ipTM到底怎么看?

本文详细解析了AlphaFold预测结果中的关键指标pLDDT、PAE、pTM和ipTM,帮助用户从单一依赖pLDDT进阶到全面理解蛋白质结构预测。通过实际案例和技巧,指导如何正确解读这些指标,避免常见错误,并提供了从预测到发表的实用建议。

weixin_29100399的博客 355

深入解析Linux Suspend/Resume机制——从用户态到内核态的完整流程

本文深入解析Linux Suspend/Resume机制,从用户态触发到内核态执行的完整流程。详细介绍了三种挂起模式(Freeze、Standby、Suspend to RAM)的实现原理,包括系统调用入口、状态验证、设备挂起流程及平台相关操作。同时提供实战调试技巧,帮助开发者解决电源管理中的常见问题。

weixin_29313239的博客 444

Java 内网穿透需要NAT硬件支持才行

内网客户端 package com.xiuye.util.network; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.*; import java.nio.charset.StandardCharsets; import java.util.concurre

修也 880

芋道前后端分离项目跳过登录

在此页面中可以看到当在没有获取到token时,如果此页面在白名单中则直接进入,所以我们将刚刚配置在。在此路径下配置需要跳过登录的页面路径,记住path中编辑的名称。根据以上两图可以发现芋道的。将所有需要跳过登录的方法。,否则会提示登录状态过期。至此完成免登录进入页面。

FanZaiYo的博客 5486

详细解读NAT和内网穿透

详细解读NAT和内网穿透 0.前言 可能是因为之前折腾过搭网站之类的事情的原因,我个人对计算机网络比较感兴趣。半年之前试过花生壳的内网穿透服务之后写过一篇文章谈内网穿透的原理,但是最近发给同学看时候他说打不开,才知道被博客园和谐了,趁机回顾再看才发现之前写的内容也有问题(那时候还没有学计算机网络),所以今天又参考了许多资料,力图正确、准确地解读一下NAT和内网穿透,这两个随着ipv6的普及很可能会被淘汰、但是我个人觉得短时间不可能完全淘汰的技术。 1.NAT-从实际案例讲起 用我自己的情况做个例子吧,我的网

勤学如春起之苗,不见其增,日有所长! 辍学如磨刀之石,不见其损,日有所亏! 1938

STM32L433使用DSP库配置过程

STM32L433中有FPU,在使用中为了使用其中的部分函数,需要对其进行配置。     配置成功后做些总结,留待后续复习备忘,同时也希望有朋友像我一样使用DSP库配置时少走弯路,留作交流。

在在在的博客 4550

CVPR 2026 即插即用 | 注意力篇 | PFG:多尺度大核+像素级频率门控,特征显著增强,精准适配边缘纹理场景

本文提出了一种基于频率引导的轻量级外围门控模块PFG,用于高效时空预测学习。该模块通过多尺度大核分解卷积(1×K + K×1)捕捉外围空间依赖,同时利用固定频率滤波器提取高频线索,动态融合不同尺度的外围特征。核心创新包括:外围聚焦的多尺度空间增强、频率引导的动态融合机制、双阶段归一化协同等。实验表明,PFGNet在多个基准数据集上达到SOTA性能,同时保持较低计算复杂度。该模块可直接嵌入各类视觉模型,适用于需要强化空间-通道协同表达的轻量级任务。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 480

UDP打洞过程与实现

许多P2P软件比如SKYPE,QQ,电驴之类需要不同内网的两台机子进行通信,而路由器的NAT机制决定了内网访问外网容易,而外网访问内网困难,那如何才能做到这一点呢?有办法------打洞! 为什么网上讲到的P2P打洞基本上都是基于UDP协议的打洞?难道TCP不可能打洞?还是TCP打洞难于实现?      假设现在有内网客户端A和内网客户端B,有公网服务端S。      如果A和B想要进行

武溪嵌人 2859

webrtc进阶-- FlexFEC 实现原理与调试分析(m80 代码对齐版)

WebRTC 中 FlexFEC 技术解析与调试指南 摘要:本文深入分析 WebRTC 的 FlexFEC(灵活前向纠错)技术实现原理,重点探讨其在 m80 版本中的协商机制、接收侧恢复流程以及 SFU 场景下的特殊处理。文章指出 FlexFEC 通过动态冗余策略提升弱网抗丢包能力,详细解析了编解码器分配、SSRC 映射、包恢复等关键环节,并提供了针对 XR+SFU 场景的调试建议。调试时可重点关注 FEC 包接收与媒体包恢复日志,以验证链路有效性。

HOSTEN的博客 49

8.1UDP点对点聊天小项目

这个Java项目实现了一个基于UDP协议的点对点聊天程序,支持双向消息发送和接收。程序通过命令行参数配置远程IP、远程端口和本地端口,默认值为127.0.0.112345和8888。核心功能包括:使用和进行UDP通信,多线程处理接收数据以避免阻塞主线程,以及通过类控制线程生命周期。程序支持UTF-8编码的消息传输,并使用GBK编码读取控制台输入这个 Java 小项目实现了一个基于 UDP 协议的简单聊天程序,支持接收和发送消息。

chxii的专栏 1304

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

java内网穿透jrp-nat-vertx

java+vertx.x 内网穿透

技术分享 1546

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

UDP打洞穿透内网

UDP穿透内网 Java前言一、为什么不能直接访问内网二、代码1.服务器代码2.客户端代码原理 前言 之前学习Socket编程的时候,写了个简单的客户端代码和服务器代码。服务器代码放在我的云服务器上,客户端代码放在我的电脑上,客户端和服务器可以进行通信,结果反过来就不可以了,我的电脑做服务器就什么也收不到,后来查了查发现是外网不能直接访问内网的原因。 一、为什么不能直接访问内网 普通人上网是通过路由器进行的,由运营商的NAT(NAPT)服务器把内网IP转换成服务器的公网IP+端口的形式去访问外网。而外网

Aruko的博客 708

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

P2P内网穿透原理

大概在一年前我就研究过P2P技术,但始终攻不破NAT内网穿透这个难题(因为本人小菜,对于网上说的一些原理始终没看明白),所以也渐渐开始淡忘这门技术了。(用了P2P技术,就可以实现无需路由的端口映射内网与内网或内网于外网直接的通讯,记得在邪八的一位大牛在谈下一代木马问题的时候就说过:下一代的木马应该用P2P技术在网络组建巨大的P2P网络,而控制端就隐藏在这巨大的P2P网络中,大大提高控制端在网络中的

qq_37392408的博客 627

Udp内网穿透终于测试成功

//file: Test.javapackage test;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInput;import java.io.ObjectOutp

gogl的专栏 6999
上一篇: 基于springboot的动态表头excel导出
下一篇: frp功能介绍,搭建和使用
FOT-Spike
博客等级 码龄8年 295粉丝 5原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值