用Java和DDNS将PC变成公网可访问的小型服务器(流量不限,带宽上限取决于宽带上限)

这篇具有很好参考价值的文章主要介绍了用Java和DDNS将PC变成公网可访问的小型服务器(流量不限,带宽上限取决于宽带上限)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

其实ipv6这个我一直有断断续续的研究,因为不是主业,而且公司的网络好像不支持ipv6,所以没花多少时间研究过。

前一阵子,我有个做短视频软件的想法,就要搞个视频服务器,最初尝试了降级用网盘解决我的需求,比如特别轻量级的一个网盘,相信对个人服务器或者内网穿透有兴趣的朋友都有用过吗,Qt封装的CHFS,很小巧的软件,用来临时存取文档是没有问题,但是对视频来说,没有分片传输,导致看一个电影需要把电影整个下载下来,就很不爽。

所以准备自己写一个视频网盘,可以像百度云盘那样,点到哪个进度就看哪里,而且加载速度要快。
当然这是需求,这有个大前提,就是服务器的流量不要钱,而且带宽足够XD。

所以ipv6服务器就首先进入了我的考虑范围,ipv6不像公网ipv4需要额外申请,而且吐槽下联通这边的效率,问了两次客服,一次师傅都说不知道ipv6是啥,上次去营业厅办业务顺便问了下,也说不知道,只有企业ipv4。所以说ipv6还是方便,实际上基本上我们每个宽带都有ipv6地址,具体的可以cmd使用ipconfig看一下就可以看到,如果没有可能是没开启。
判断开没开启ipv6,CSDN博客
我浓缩精华,直接访问https://test-ipv6.com/,这个网站可以直接显示你当前电脑是否能访问ipv6。
用Java和DDNS将PC变成公网可访问的小型服务器(流量不限,带宽上限取决于宽带上限),开源项目爬坑,java,服务器,数据库
通过这个老哥的启发,想到了可以直接用ipv6

ipv6好用是好用,但是缺点就是个人ipv6地址是在不断变化的,如果能获得一个固定的网址,那访问起来就变得很容易了。

一、编写工具类

引入maven
我使用的是腾讯云的DDNS映射,主要是腾讯云的轻量服务器价格太哇塞了,家人们谁懂 XD。

        <dependency>
            <groupId>com.tencentcloudapi</groupId>
            <artifactId>tencentcloud-sdk-java-common</artifactId>
            <version>LATEST</version>
        </dependency>
        <dependency>
            <groupId>com.tencentcloudapi</groupId>
            <artifactId>tencentcloud-sdk-java-dnspod</artifactId>
            <version>LATEST</version>
        </dependency>

然后编写一个工具类代码

import com.ruoyi.common.core.utils.StringUtils;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.dnspod.v20210323.DnspodClient;
import com.tencentcloudapi.dnspod.v20210323.models.DescribeRecordListRequest;
import com.tencentcloudapi.dnspod.v20210323.models.DescribeRecordListResponse;
import com.tencentcloudapi.dnspod.v20210323.models.ModifyRecordRequest;
import com.tencentcloudapi.dnspod.v20210323.models.ModifyRecordResponse;

import java.io.BufferedReader;
import java.io.InputStreamReader;

/**
 * cmd提取ipv6
 * @author admin
 */
public class Ipv6Utils {

    final static String cmd = "ipconfig";

    final static String target = "IPv6 地址 . . . . . . . . . . . . :";

    final static String SecretId = "你的腾讯云DDNSDOP SecretId";

    final static String SecretKey = "你的腾讯云DDNSDOP SecretKey ";

    final static Long RecordId = 0L; //你的腾讯云DDNSDOP RecordId 

    /**
     * 获取服务所在机器ipv6
     */
    private static String getIpv6() {
        String ipv6 = StringUtils.EMPTY;
        Process process = null;
        try {
            process = Runtime.getRuntime().exec(cmd);

            BufferedReader output = new BufferedReader(new InputStreamReader(process.getInputStream(),
                    System.getProperty("sun.jnu.encoding")));
            BufferedReader outputErr = new BufferedReader(new InputStreamReader(process.getErrorStream(),
                    System.getProperty("sun.jnu.encoding")));
            String line = "";
            Long l1 = 0L;
            Long l2 = 0L;
            while ((line = output.readLine()) != null) {
                l1++;
                if (line.trim().startsWith(target) && !line.contains("::")) {
                    ipv6 = line.trim().replace(target, StringUtils.EMPTY);
                }
            }
            while ((line = outputErr.readLine()) != null) {
                l2++;
            }
        } catch (Exception e) {
            //e.printStackTrace();
        } finally {
            if (process != null) {
                process.destroy();
            }
            return ipv6;
        }
    }

    public static void updateDnsPod(){
        String ipv6 = Ipv6Utils.getIpv6();
        if(StringUtils.isNotEmpty(ipv6)){
            Ipv6Utils.updateDnsPod(ipv6);
        }
    }

    /**
     * 更新腾讯云dns
     */
    private static void updateDnsPod(String ipv6){
        try{
            // 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密
            // 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305
            // 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取
            Credential cred = new Credential(SecretId, SecretKey);
            // 实例化一个http选项,可选的,没有特殊需求可以跳过
            HttpProfile httpProfile = new HttpProfile();
            httpProfile.setEndpoint("dnspod.tencentcloudapi.com");
            // 实例化一个client选项,可选的,没有特殊需求可以跳过
            ClientProfile clientProfile = new ClientProfile();
            clientProfile.setHttpProfile(httpProfile);
            // 实例化要请求产品的client对象,clientProfile是可选的
            DnspodClient client = new DnspodClient(cred, "", clientProfile);
            // 实例化一个请求对象,每个接口都会对应一个request对象
            ModifyRecordRequest req = new ModifyRecordRequest();
            req.setDomain("disspua.com"); //填写你的域名
            req.setSubDomain("xxx"); //xxx.disspua.com 就是我的域名
            req.setRecordType("AAAA"); //AAAA是ipv6使用的RecordType
            req.setRecordLine("默认");
            req.setValue(ipv6); //获取到的当前ipv6地址
            req.setRecordId(RecordId);
            // 返回的resp是一个ModifyRecordResponse的实例,与请求对象对应
            ModifyRecordResponse resp = client.ModifyRecord(req);
            // 输出json格式的字符串回包
            System.out.println(ModifyRecordResponse.toJsonString(resp));
        } catch (TencentCloudSDKException e) {
            System.out.println(e.toString());
        }
    }

    /**
     * 获取腾讯云dns列表
     */
    private void getDnsList(){
        try{
            // 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密
            // 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305
            // 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取
            Credential cred = new Credential(SecretId, SecretKey);
            // 实例化一个http选项,可选的,没有特殊需求可以跳过
            HttpProfile httpProfile = new HttpProfile();
            httpProfile.setEndpoint("dnspod.tencentcloudapi.com");
            // 实例化一个client选项,可选的,没有特殊需求可以跳过
            ClientProfile clientProfile = new ClientProfile();
            clientProfile.setHttpProfile(httpProfile);
            // 实例化要请求产品的client对象,clientProfile是可选的
            DnspodClient client = new DnspodClient(cred, "", clientProfile);
            // 实例化一个请求对象,每个接口都会对应一个request对象
            DescribeRecordListRequest req = new DescribeRecordListRequest();
            req.setDomain("disspua.com");
            // 返回的resp是一个DescribeRecordListResponse的实例,与请求对象对应
            DescribeRecordListResponse resp = client.DescribeRecordList(req);
            // 输出json格式的字符串回包
            System.out.println(DescribeRecordListResponse.toJsonString(resp));
        } catch (TencentCloudSDKException e) {
            System.out.println(e.toString());
        }
    }
}

二、加入启动计划

/**
 * 网关启动程序
 * 
 * @author admin
 */
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class })
public class GatewayApplication
{
    public static void main(String[] args)
    {
        //动态绑定ipv6
        Ipv6Utils.updateDnsPod();
        SpringApplication.run(GatewayApplication.class, args);
        System.out.println("(♥◠‿◠)ノ゙  网关启动成功   ლ(´ڡ`ლ)゙  \n" +
                "                                    _  _                                                                          \n" +
                "                                   | |(_)                                                                         \n" +
                " __      ____      ____      __  __| | _  ___  ___  _ __   _   _   __ _     ___  ___   _ __ ___                   \n" +
                " \\ \\ /\\ / /\\ \\ /\\ / /\\ \\ /\\ / / / _` || |/ __|/ __|| '_ \\ | | | | / _` |   / __|/ _ \\ | '_ ` _ \\      \n" +
                "  \\ V  V /  \\ V  V /  \\ V  V /_| (_| || |\\__ \\\\__ \\| |_) || |_| || (_| | _| (__| (_) || | | | | |          \n" +
                "   \\_/\\_/    \\_/\\_/    \\_/\\_/(_)\\__,_||_||___/|___/| .__/  \\__,_| \\__,_|(_)\\___|\\___/ |_| |_| |_|      \n" +
                "                                                   | |                                                            \n" +
                "                                                   |_|                                                            \n");
    }
}

三、结语

ok,测试用过后直接加入到网关启动类的启动命令之前,这样启动微服务的时候都会刷新DDNSDop控制台里的ipv6记录,更新为本地最新的ipv6记录,这样就可以通过域名愉快的访问服务了。
这方案好就好在,手机流量是自动走ipv6的,之前和对象想连麦看电影,都是版权限制,现在可没那些限制了,直接个人服务器走起。文章来源地址https://www.toymoban.com/news/detail-791722.html

到了这里,关于用Java和DDNS将PC变成公网可访问的小型服务器(流量不限,带宽上限取决于宽带上限)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 配置公网访问内网服务器

    闲来无事,打算用 树莓派5 在家部署个小服务器,于是,申请了 动态公网ip 。便有了配置过程,又因为升级家里网络配置,选择了锐捷的子母路由进行 无线MESH 组网(后期看情况是否搞单线回程有线MESH,因为家里的配电箱空间太小了,没有接入交换机的空间)。 方案一:端

    2024年03月23日
    浏览(33)
  • 使用公网访问内网IIS网站服务器【无需公网IP】

    前言 这里介绍通过内网穿透,实现公网访问内网IIS网站服务器。 都知道,现在基本不会被分配到公网IP了,普遍是内网IP。而在没有公网IP的情况下,想要从公网访问在本地的IIS网站服务器,一般都是通过内网穿透。 市面上内网穿透的工具有很多,但是有的会限制流量,或者

    2024年02月13日
    浏览(30)
  • 公网远程访问macOS本地web服务器

    # 公网访问macOS本地web服务器【内网穿透】 以macOS自带的Apache为例,在本地启用apache服务器,并通过cpolar内网穿透将其暴露至公网,实现在公网环境下访问本地web服务。 1. 启动Apache服务器 在macOS上打开终端,执行命令启动Apache服务器,提示 Passwod ,输入密码 浏览器访问localh

    2024年02月08日
    浏览(31)
  • ddns有什么作用?无公网IP怎么将内网IP端口映射外网访问

    DDNS是什么? DDNS英文全称Dynamic Domain Name Server,中文含义是指动态域名服务。很多普通路由器或者智能路由器设置中,都可以找到DDNS(动态DNS)功能。 上面的解释可能过于专业,其实DDNS通俗点说,它是一种将用户的动态IP地址映射到一个固定的域名解析服务上的功能,因为现

    2024年02月02日
    浏览(48)
  • 彻底解决公网ip无法访问服务器的问题

    用服务器的公网ip访问突然提示页面无法访问了,之前还是ok的: 步骤1. 检查云服务器的安全组规则是否有添加80端口映射,如果没有需要手动添加,否则不能使用公网访问,检查了一下是有的: 步骤2. 检查服务器防火墙入站规则里面是否添加了80端口,否则访问会被拦截,经

    2024年02月01日
    浏览(45)
  • 本地电脑搭建SFTP服务器,并实现公网访问

    1.1 下载 freesshd 服务器软件 下载地址:freeSSHd and freeFTPd 选择freeFTPD.exe下载 下载后,点击安装 安装之后,它会提示是否启动后台服务,Yes 安装后,点击开始菜单– freeFTPd, 注意 :这里要点击鼠标右键, 以管理员权限 打开freeFTPd,如果以普通用户打开freeFTPd, 将无法保存配置

    2024年02月08日
    浏览(50)
  • 【Linux】公网远程访问AMH服务器管理面板

    AMH 是一款基于 Linux 系统的服务器管理面板,它提供了一系列的功能,包括网站管理、FTP 管理、数据库管理、DNS 管理、SSL 证书管理等。使用 AMH 云主机面板可以方便地管理服务器,提高工作效率。 AMH面板远程访问的好处在于,用户可以通过互联网远程登录到服务器主机面板

    2024年02月04日
    浏览(34)
  • 搭建frp+OpenVPN实现公网服务器对内网服务器的访问

    1.1实验需求 本实验需求一台公网服务器,两台内网服务器 公网服务器:作为frp服务端以及openvpn客户端 第一台内网服务器:作为frp客户端以及openvpn服务端 第二台内网服务器:需进行openvpn客户端配置(测试用) 1.2配置yum源 2.1服务端配置(公网服务器) 下载并解压frp数据包

    2024年02月04日
    浏览(36)
  • WinSCP如何使用公网TCP地址访问本地服务器

    ​ Winscp 是一个支持 SSH( Secure SHell)的 可视化 SCP(Secure Copy)文件传输软件,它的主要功能是在本地与远程计算机间安全地复制文件,并且可以直接编辑文件。 ​ 可视化操作就是直接把文件 从本机拖入 ,打开文件 直接双击 即可。 软件特性 支持协议众多:SSH ,FTP、SFTP、FTPS、

    2024年01月25日
    浏览(35)
  • 本地搭建web服务器、个人博客并发布公网访问

    在现代社会,网络已经成为我们生活离不开的必需品,而纷繁多样的个人博客网站,也成为了个人展示的最好平台。在以往,想要搭建一个个人博客网站需要较深的专业知识,但得益于软件技术的发展,就算普通人也可以在几个软件的帮助下,在自己的电脑或电子设备上,建

    2024年02月14日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包