当前位置: 首页 > news >正文

一个java类实现UDP代理转发

 概述

实现一个UDP代理服务器,它监听一个指定的端口,将接收到的UDP数据包转发到目标主机,并将目标主机的响应转发回原始客户端。使用线程池来异步处理响应,并使用日志记录器来记录不同级别的日志信息。

源代码

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;public class UDPProxy {private final int listenPort;private final String targetHost;private final int targetPort;private final Map<DatagramSocket, DatagramPacket> downPacketCache = new ConcurrentHashMap<>();private final ThreadPoolExecutor executor = new ThreadPoolExecutor(8, 16,60L, TimeUnit.SECONDS, new LinkedBlockingQueue<>(200), new ThreadPoolExecutor.CallerRunsPolicy());private static final Logger logger = Logger.getLogger("UDPProxy");public UDPProxy(int listenPort, String targetHost, int targetPort) {this.listenPort = listenPort;this.targetHost = targetHost;this.targetPort = targetPort;//设置日志级别logger.setLevel(Level.INFO);}public void start() {try (DatagramSocket thisSocket = new DatagramSocket(listenPort)) {byte[] receiveData = new byte[4096];logger.warning("UDP Proxy started, listening on port " + listenPort);Map<InetAddress, DatagramSocket> upSocketCache = new ConcurrentHashMap<>();while (true) {DatagramPacket upPacket = new DatagramPacket(receiveData, receiveData.length);thisSocket.receive(upPacket);byte[] data = upPacket.getData();int length = upPacket.getLength();InetAddress clientAddress = upPacket.getAddress();logger.warning("[UP] Size:" + length + ",from" + clientAddress + ":" + upPacket.getPort());logger.info("[UP] Packet:" + new String(data, 0, length, StandardCharsets.UTF_8));// Forward the packet to the target hostInetAddress targetAddress = InetAddress.getByName(targetHost);DatagramPacket sendPacket = new DatagramPacket(data, length, targetAddress, targetPort);DatagramSocket upSocket = upSocketCache.get(clientAddress);if (upSocket == null) {upSocket = new DatagramSocket();upSocketCache.put(clientAddress, upSocket);downPacketCache.put(upSocket, upPacket);upSocket.send(sendPacket);responseListener(thisSocket, upSocket);} else {upSocket.send(sendPacket);}}} catch (IOException e) {logger.log(Level.SEVERE, "Error in UDPProxy", e);}}private void responseListener(DatagramSocket thisSocket, DatagramSocket upSocket) {executor.execute(() -> {while (true) {byte[] downData = new byte[4096];DatagramPacket downPacket = new DatagramPacket(downData, downData.length);byte[] data = downPacket.getData();InetAddress downPacketAddress;try {upSocket.receive(downPacket);downPacketAddress = downPacket.getAddress();int length = downPacket.getLength();logger.warning("[DOWN] Size:" + length + ",From" + downPacketAddress + ":" + downPacket.getPort());logger.info("[DOWN] Packet:"+ new String(data, 0, length, StandardCharsets.UTF_8));DatagramPacket datagramPacket = downPacketCache.get(upSocket);if (datagramPacket != null) {datagramPacket.setData(data);thisSocket.send(datagramPacket);}} catch (IOException e) {logger.log(Level.SEVERE, "Error in responseListener", e);}}});}public static void main(String[] args) {if (args.length != 3) {logger.warning("Usage: java UDPProxy <listenPort> <targetHost> <targetPort>");System.exit(1);}int listenPort = Integer.parseInt(args[0]);String targetHost = args[1];int targetPort = Integer.parseInt(args[2]);UDPProxy proxy = new UDPProxy(listenPort, targetHost, targetPort);proxy.start();}
}

代码启动

java UDPProxy <listenPort> <targetHost> <targetPort>

  • listenPort:代理服务器监听的端口。

  • targetHost:目标主机的地址。

  • targetPort:目标主机的端口。

 java UDPProxy 12681 192.168.18.76 6666

代码剖析

类和成员变量

  1. 成员变量

    • listenPort:代理服务器监听的端口。

    • targetHost:目标主机的地址。

    • targetPort:目标主机的端口。

    • downPacketCache:用于缓存下行数据包的映射。

    • executor:用于处理响应监听的线程池。

    • logger:用于日志记录的Logger对象。

构造方法

  • 构造方法

    • 初始化listenPorttargetHosttargetPort

    • 设置日志级别为INFO

start方法

  • start方法

    • 创建一个DatagramSocket实例,监听指定的端口。

    • 无限循环接收传入的UDP数据包。

    • 将接收到的数据包转发到目标主机。

    • 使用upSocketCache缓存每个客户端的DatagramSocket实例。

    • 调用responseListener方法监听目标主机的响应。

responseListener方法

  • responseListener方法

    • 使用线程池异步处理目标主机的响应。

    • 接收目标主机的响应数据包。

    • downPacketCache中获取原始客户端的数据包,并将响应数据包发送回原始客户端。

main方法

  • main方法

    • 解析命令行参数,创建UDPProxy实例并启动代理服务器。

相关文章:

一个java类实现UDP代理转发

概述 实现一个UDP代理服务器&#xff0c;它监听一个指定的端口&#xff0c;将接收到的UDP数据包转发到目标主机&#xff0c;并将目标主机的响应转发回原始客户端。使用线程池来异步处理响应&#xff0c;并使用日志记录器来记录不同级别的日志信息。 源代码 import java.io.I…...

K8s问题案例分析

1.worker节点宕机&#xff0c;请说明一下pod的驱逐流程&#xff1a; k8s有一个节点控制器&#xff0c;节点控制器在一段时间内无法和kubelet通信&#xff0c;那么就会给节点打上unknown 状态&#xff0c;并自动创建NoExecute污点,避免调度器调度新的pod到该节点。同时已经在这…...

爬虫集群部署:Gerapy 框架详细解析

&#x1f680; 爬虫集群部署&#xff1a;Gerapy 框架详细解析 &#x1f6e0;️ Gerapy 环境搭建 Gerapy 是一个基于 Scrapy 的爬虫框架&#xff0c;专注于爬虫项目的管理和集群部署。下面将详细介绍如何搭建 Gerapy 环境&#xff0c;并进行初步配置。 Gerapy 环境搭建: 安装 …...

文本相似度 HanPL汉语言处理

文章目录 前言需求简介实操开始1. 添加pom.xml依赖2. 文本相似度工具类3. 案例验证4. 验证结果 总结 前言 请各大网友尊重本人原创知识分享&#xff0c;谨记本人博客&#xff1a;南国以南i、 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 需求 当我…...

Linux软件包管理器 yum

目录 0.前言 1.什么是软件包 2.rz和sz 2.1rz命令 2.2sz命令 2.3操作示例 3.安装前注意事项 3.1保证网络畅通 3.2确保权限 3.3配置软件仓库 3.4 检查系统更新 4.查看软件包 5.安装软件 5.1作为root用户安装软件 5.2作为非root用户安装软件 5.3注意事项 6.卸载软件 6.1使用yum卸载…...

图像变换算法

1.1 傅里叶变换 (Fourier Transform) 介绍 傅里叶变换是一种数学变换&#xff0c;用于将图像从空间域转换到频率域。它广泛应用于图像去噪和滤波。 原理 傅里叶变换将图像表示为频率成分的叠加&#xff0c;使得频率成分可以独立处理。通过对频率成分的分析和处理&#xff0…...

谷粒商城实战笔记-131~132-商城业务-商品上架-构造sku检索属性和库存查询

文章目录 一&#xff0c;131-商城业务-商品上架-构造sku检索属性1&#xff0c;开发目标2&#xff0c;详细设计2.1&#xff0c;根据spu_id获取所有的规格参数2.2&#xff0c;根据上一步中查询结果进一步确认是否可搜索2.3&#xff0c;将可搜索的属性封装到Java模型中 二&#xf…...

【Python学习-UI界面】PyQt5 QLabel小部件

序号组件说明详细介绍链接1QLabel用作占位符&#xff0c;用于显示不可编辑的文本、图像&#xff0c;或者动画GIF的电影。它也可以用作其他小部件的助记符键。2QLineEdit是最常用的输入字段。它提供了一个框&#xff0c;可以输入一行文本。要输入多行文本&#xff0c;需要使用QT…...

vue项目打包问题

缓存导致打包后js文件404 修改vue.config.js打包输出文件名为动态&#xff0c;例如取当前时间戳。 在index.html文件添加meta标签设置不缓存。 更新完包&#xff0c;假如用户此刻正访问某一个页面时&#xff0c;访问的包还是原来的情况导致出现bug 解决VUE项目更新后需要客户手…...

C++标准模板库(STL)|容器|vector| queue|

对STL进行总结&#xff0c;STL是standard template library的简写&#xff0c;是C中的一个标准模板库&#xff0c;用于实现常用的数据结构和算法&#xff0c;它是C程序员经常使用的一个工具箱。STL 的主要目的是提高开发效率和代码质量&#xff0c;使得程序员可以更加便捷地完成…...

【Android】安卓四大组件之Service用法

文章目录 使用Handler更新UIService基本特点启动方式非绑定式服务使用步骤 绑定式服务步骤 生命周期非绑定式启动阶段结束阶段 绑定式启动阶段结束阶段 前台Service使用步骤结束结束Service本身降级为普通Service降级为普通Service 使用Handler更新UI 主线程创建Handler对象&a…...

Python爬虫入门实战(详细步骤)

1. 技术选型 爬虫这个功能&#xff0c;我个人理解是什么语言都能写的&#xff0c;只要能正常发送 HTTP 请求&#xff0c;将响应回来的静态页面模版 HTML 上把我们所需要的数据提取出来就可以了&#xff0c;原理很简单&#xff0c;这个东西当然可以手动去统计收集&#xff0c;但…...

5、Linux : 网络相关

OSI七层网络模型 TCP/IP四层 概念模型 对应网络协议 应用层&#xff08;Application&#xff09; HTTP、TFTP, FTP, NFS, WAIS、 表示层&#xff08;Presentation&#xff09; 应用层 Telnet, Rlogin, SNMP, Gopher 会话层&#xff08;Session&#xff09; SMTP…...

Linux中针对文件权限的解析

1.文件权限详细解析&#xff1a; -rw-r--r--. 1 root root 114 4月 10 16:32 100.txt 1)-rw-r--r--. 总共11位 第一个“-”和最后一个“.”不用去管&#xff0c;剩下 rw- r-- r-- 属主 属组 其他人 u g o 第一个是“-”表示普通文件 第一个是“d”表示文件目录 …...

【0304】psql 执行“VACUUM FULL”命令的背后实现过程

1. 概述 在前面讲解Postgres内核中解析器相关(【0297】Postgres内核之 INSERT INTO 原始解析树 转 Query 树 (1))内容时,曾提到过,Postgres内核大致将用户下发的SQL语句分为三大类,这里的VACUUM FULL属于CMD_UTILITY; 因此直接调用utility.c(实用程序)中的对应函数。…...

Java常见面试题-11-MongoDb

文章目录 MongoDB 是什么&#xff1f;MongoDB 和关系型数据库 mysql 区别MongoDB 有 3 个数据库分别是什么&#xff1f;MongoDB 中的数据类型MongoDB 适用业务场景 MongoDB 是什么&#xff1f; mongodb 是属于文档型的非关系型数据库&#xff0c;是开源、高性能、高可用、可扩…...

PBLOCK

PBLOCK是附加到Vivado中分配给Pblocks的单元格的只读属性 设计套房。 Pblock是一组单元格&#xff0c;以及一个或多个指定 Pblock所包含的设备资源。在平面规划过程中使用了Pblocks 将其放置到组相关逻辑中&#xff0c;并将其分配到目标设备的某个区域。请参阅 Vivado设计套件用…...

电子纸打造智能、自动化、绿色的工作流程

电子纸打造智能、自动化、绿色的工作流程 RFID技术最早在1940年代问世&#xff0c;1980年开始商业化使用。直到现在RFID&#xff08;无线射频识别&#xff09;技术已经深入到我们生活的方方面面。特别是在工业生产、物流运输等领域&#xff0c;RFID技术发挥着越来越重要的作用…...

Redis 的6种回收策略(淘汰策略)详解

Redis 的6种回收策略&#xff08;淘汰策略&#xff09;详解 1、Redis的六种淘汰策略1. volatile-lru2. volatile-ttl3. volatile-random4. allkeys-lru5. allkeys-random6. no-eviction 2、使用策略规则 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&am…...

SQL注入sqli-labs-master关卡一

本文环境搭建使用的是小皮&#xff0c;靶机压缩包&#xff1a;通过百度网盘分享的文件&#xff1a;sqli-labs-php7-master.zip 链接&#xff1a;https://pan.baidu.com/s/1xBfsi2lyrA1QgUWycRsHeQ?pwdqwer 提取码&#xff1a;qwer 下载解压至phpstudy的WWW目录下即可。 第一…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...