UDP 打洞 java demo

2023-05-16

UDP打洞的具体原理就不细说了文章还是很多,说下我的网络环境,家里台式电脑网线连的家里路由器(移动宽带),公司台式电脑网线连的公司路由器(电信宽带),一台有公网IP的华为云主机(我是试用一个月的)
1、华为云主机UDPServer代码

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.LinkedHashMap;

public class UDPServer {
    private static ArrayList<String> c = new ArrayList<String>();
    public static void main(String[] args) throws IOException, InterruptedException {
        DatagramSocket server = new DatagramSocket(9999);
        byte[] bytes = new byte[1024];
        while (true) {
            DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
            server.receive(packet);
            InetAddress address = packet.getAddress();
            int port = packet.getPort();
            String s = address.getHostAddress()+":"+port;
            System.out.println("收到->"+s+"的消息:");

            if (!c.contains(s)){
                c.add(s);
            }

            for (String s1 : c) {
                if (!s1.equals(s)){
                    byte[] b = ("this is server:"+s1).getBytes();
                    DatagramPacket packet1 = new DatagramPacket(b, b.length, address,port);
                    server.send(packet1);
                }
            }
        }
    }
}

2、公司台式电脑的UDPClient端代码

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.concurrent.TimeUnit;

public class UDPClient {
    private static final ArrayList<String> c = new ArrayList<String>();
    private static boolean b=true;
    public static void main(String[] args) throws IOException, InterruptedException {
        DatagramSocket socket = new DatagramSocket();
        new Thread(()->{
            try {
                byte[] bytes = new byte[1024];
                DatagramPacket packet1 = new DatagramPacket(bytes, bytes.length);
                while (true){
                    socket.receive(packet1);
                    String receive = new String(bytes,0,packet1.getLength());
                    if (receive.contains("server")){
                        c.add(receive);
                    }
                    if (receive.contains("client")){
                        b = false;
                    }
                    System.out.println(receive);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }).start();

        byte[] data1 = "client:my is company".getBytes();
        while (true){
            if (b) {
                DatagramPacket packet1 = new DatagramPacket(data1, data1.length, InetAddress.getByName("121.36.221.82"),9999);
                socket.send(packet1);
            }
            if (!c.isEmpty()){
                DatagramPacket packet2 = new DatagramPacket(data1, data1.length, InetAddress.getByName(c.get(0).split(":")[1]), Integer.parseInt(c.get(0).split(":")[2]));
                socket.send(packet2);
            }
            TimeUnit.SECONDS.sleep(2);
        }
    }
}

3、家里的台式电脑和UDPClient的代码一样,修改sleep的时间为1秒,为了区分客户端发送的消息company可以改为family。121.36.21.88是我的华为云主机公网IP,代码也没有什么逻辑就没写注释,先启动Server,再启动两个客户端代码,如果客户端不停打印出my is company的提示说明打洞成功。成功后客户端不会再给Server发送消息,后面再贴Android的demo

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UDP 打洞 java demo 的相关文章

  • 序列的排列?

    我有具体数量的数字 现在我想以某种方式显示这个序列的所有可能的排列 例如 如果数字数量为3 我想显示 0 0 0 0 0 1 0 0 2 0 1 0 0 1 1 0 1 2 0 2 0 0 2 1 0 2 2 1 0 0 1 0 1 1 0
  • .properties 中的通配符

    是否存在任何方法 我可以将通配符添加到属性文件中 并且具有所有含义 例如a b c d lalalala 或为所有以结尾的内容设置一个正则表达式a b c anything 普通的 Java 属性文件无法处理这个问题 不 请记住 它实际上是
  • Spring AspectJ 在双代理接口时失败:无法生成类的 CGLIB 子类

    我正在使用Spring的
  • HSQL - 识别打开连接的数量

    我正在使用嵌入式 HSQL 数据库服务器 有什么方法可以识别活动打开连接的数量吗 Yes SELECT COUNT FROM INFORMATION SCHEMA SYSTEM SESSIONS
  • 如何在 Spring 中禁用使用 @Component 注释创建 bean?

    我的项目中有一些用于重构逻辑的通用接口 它看起来大约是这样的 public interface RefactorAwareEntryPoint default boolean doRefactor if EventLogService wa
  • 如何更改javaFX中按钮的图像?

    我正在使用javaFX 我制作了一个按钮并为此设置了图像 代码是 Image playI new Image file c Users Farhad Desktop icons play2 jpg ImageView iv1 new Ima
  • 谷歌应用程序引擎会话

    什么是java应用程序引擎 默认会话超时 如果我们将会话超时设置为非常非常长的时间 会不会产生不良影响 因为谷歌应用程序引擎会话默认情况下仅存储在数据存储中 就像facebook一样 每次访问该页面时 会话仍然永远存在 默认会话超时设置为
  • 从最终实体获取根证书和中间证书

    作为密码学的菜鸟 我每天都会偶然发现一些简单的事情 今天只是那些日子之一 我想用 bouncy castle 库验证 java 中的 smime 消息 我想我几乎已经弄清楚了 但此时的问题是 PKIXparameters 对象的构建 假设我
  • Eclipse Maven Spring 项目 - 错误

    I need help with an error which make me crazy I started to study Java EE and I am going through tutorial on youtube Ever
  • jdbc mysql loginTimeout 不起作用

    有人可以解释一下为什么下面的程序在 3 秒后超时 因为我将其设置为在 3 秒后超时 12秒 我特意关闭了mysql服务器来测试mysql服务器无法访问的这种场景 import java sql Connection import java
  • 像 Java 这样的静态类型语言中动态方法解析背后的原因是什么

    我对 Java 中引用变量的动态 静态类型和动态方法解析的概念有点困惑 考虑 public class Types Override public boolean equals Object obj System out println i
  • volatile、final 和synchronized 安全发布的区别

    给定一个带有变量 x 的 A 类 变量 x 在类构造函数中设置 A x 77 我们想将 x 发布到其他线程 考虑以下 3 种变量 x 线程安全 发布的情况 1 x is final 2 x is volatile 3 x 设定为同步块 sy
  • 如何在用户输入数据后重新运行java代码

    嘿 我有一个基本的java 应用程序 显示人们是成年人还是青少年等 我从java开始 在用户输入年龄和字符串后我找不到如何制作它它们被归类为 我希望它重新运行整个过程 以便其他人可以尝试 的节目 我一直在考虑做一个循环 但这对我来说没有用
  • 如何访问JAR文件中的Maven资源? [复制]

    这个问题在这里已经有答案了 我有一个使用 Maven 构建的 Java 应用程序 我有一个资源文件夹com pkg resources 我需要从中访问文件 例如directory txt 我一直在查看各种教程和其他答案 但似乎没有一个对我有
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • 不接受任何内容也不返回任何内容的函数接口[重复]

    这个问题在这里已经有答案了 JDK中是否有一个标准的函数式接口 不接受也不返回任何内容 我找不到一个 像下面这样 FunctionalInterface interface Action void execute 可运行怎么样 Functi
  • Eclipse 启动时崩溃;退出代码=13

    I am trying to work with Eclipse Helios on my x64 machine Im pretty sure now that this problem could occur with any ecli
  • 找不到符号 NOTIFICATION_SERVICE?

    package com test app import android app Notification import android app NotificationManager import android app PendingIn
  • 使用反射覆盖最终静态字段是否有限制?

    在我的一些单元测试中 我在最终静态字段上的反射中遇到了奇怪的行为 下面是说明我的问题的示例 我有一个基本的 Singleton 类 其中包含一个 Integer public class BasicHolder private static

随机推荐