Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用Java创建集成JACOB的HTTP服务

使用Java创建集成JACOB的HTTP服务

作者头像
科技新语
发布于 2024-09-09 10:06:44
发布于 2024-09-09 10:06:44
9700
代码可运行
举报
运行总次数:0
代码可运行

背景介绍

Windows环境中,Java应用有时需要与Windows的COM组件进行交互。JACOB(Java COM Bridge)提供了一个桥梁,使得Java可以调用Windows的COM对象。本文将介绍如何创建一个Java HTTP服务,并集成JACOB来与Windows系统交互。

1、环境配置

首先,确保你已经安装了JDK和Maven。接着,在你的Maven项目的pom.xml文件中添加JACOB依赖:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pom.xml 代码解读复制代码<dependency>
    <groupId>com.hynnet</groupId>
    <artifactId>jacob</artifactId>
    <version>1.18</version>
</dependency>

这将自动下载JACOB库,并将其添加到你的项目中。

2、创建集成JACOB的HTTP服务

2.1 动态加载JACOB DLL
44444.png
44444.png

JACOB库需要用到DLL文件。我们将从资源中提取DLL文件,并动态加载它。以下代码展示了如何提取DLL并设置系统属性:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java 代码解读复制代码private static String extractDll(String dllFileName) throws IOException {
    InputStream dllStream = WindowsClient.class.getResourceAsStream("/lib/" + dllFileName);
    if (dllStream == null) {
        log.error("DLL 文件不存在: " + dllFileName);
        throw new IOException("DLL 文件不存在: " + dllFileName);
    }

    File tempDll = Files.createTempFile("jacob", ".dll").toFile();
    tempDll.deleteOnExit();

    try (FileOutputStream fos = new FileOutputStream(tempDll)) {
        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = dllStream.read(buffer)) != -1) {
            fos.write(buffer, 0, bytesRead);
        }
    }

    return tempDll.getAbsolutePath();
}

在main方法中,调用extractDll方法提取DLL,并通过LibraryLoader类动态加载DLL:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java 代码解读复制代码public static void main(String[] args) throws IOException {
    String dllPath = extractDll("jacob-1.18-x64.dll");
    System.setProperty(LibraryLoader.JACOB_DLL_PATH, dllPath);
    LibraryLoader.loadJacobLibrary();
    // 继续后续步骤
}
2.2 创建并配置HTTP服务器

使用Java的HttpServer类创建一个简单的HTTP服务。服务器将监听指定的端口,并定义请求处理器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java 代码解读复制代码int clientPort = 10005;
InetAddress localHost = InetAddress.getLocalHost();
String hostAddress = localHost.getHostAddress();

log.info("客户端启动,监听端口 " + clientPort);
log.info("访问地址: http://" + hostAddress + ":" + clientPort + "/receive");

HttpServer server = HttpServer.create(new InetSocketAddress(clientPort), 0);
server.createContext("/receive", new ReceiveHandler());
server.setExecutor(Executors.newCachedThreadPool());
server.start();
2.3 实现IP白名单
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java 代码解读复制代码private static final Set<String> WHITELIST = new HashSet<>();
static {
    WHITELIST.add("127.0.0.1");
    WHITELIST.add("20.47.122.28");
}

static class ReceiveHandler implements HttpHandler {
    @Override
    public void handle(HttpExchange exchange) throws IOException {
        String remoteAddress = exchange.getRemoteAddress().getAddress().getHostAddress();
        log.info("收到来自 " + remoteAddress + " 的请求");

        if (!WHITELIST.contains(remoteAddress)) {
            String response = "403 Forbidden - 您的IP地址不在白名单中";
            exchange.sendResponseHeaders(403, response.getBytes().length);
            exchange.getResponseBody().write(response.getBytes());
            exchange.getResponseBody().close();
            log.info("拒绝访问: " + remoteAddress);
            return;
        }

        // 继续处理请求
    }
}
2.4 处理HTTP请求

在ReceiveHandler中处理HTTP请求,包括记录日志和响应请求。以下是如何读取请求体并处理消息的代码示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ini 代码解读复制代码@Override
public void handle(HttpExchange exchange) throws IOException {
    String remoteAddress = exchange.getRemoteAddress().getAddress().getHostAddress();
    log.info("收到来自 " + remoteAddress + " 的请求");

    if (!WHITELIST.contains(remoteAddress)) {
        String response = "403 Forbidden - 您的IP地址不在白名单中";
        exchange.sendResponseHeaders(403, response.getBytes().length);
        exchange.getResponseBody().write(response.getBytes());
        exchange.getResponseBody().close();
        log.info("拒绝访问: " + remoteAddress);
        return;
    }

    InputStream is = exchange.getRequestBody();
    byte[] bytes = readAllBytes(is);
    String message = new String(bytes, StandardCharsets.UTF_8);
    log.info("接收到的消息: " + message);

    String response = "消息已接收并处理";
    exchange.sendResponseHeaders(200, response.getBytes().length);
    exchange.getResponseBody().write(response.getBytes());
    exchange.getResponseBody().close();
}

private byte[] readAllBytes(InputStream is) throws IOException {
    ByteArrayOutputStream buffer = new ByteArrayOutputStream();
    byte[] data = new byte[1024];
    int bytesRead;
    while ((bytesRead = is.read(data, 0, data.length)) != -1) {
        buffer.write(data, 0, bytesRead);
    }
    return buffer.toByteArray();
}

3、总结

本文介绍了如何在Java中创建一个集成JACOB的HTTP服务。我们详细讲解了动态加载JACOB DLL、创建和配置HTTP服务器、实现IP白名单以及处理HTTP请求的具体实现步骤。通过这些步骤,你可以在Java应用中调用Windows的COM组件,并通过HTTP接口与外部系统进行交互。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
腾讯会议API - Webhook介绍与简单实现
可以看到,REST API是由用户应用主动向腾讯会议后台发起请求,然后后台进行响应;而Webhook是由特定事件来触发,然后腾讯Webhook服务主动向用户发起请求。例如在配置Webhook时订阅了用户入会事件消息之后,当会议中有人入会时,后台就会给用户配置的Webhook应用发送POST消息。
liquid
2023/08/17
3K0
知名Java日志组件Log4j2爆出严重0 day漏洞,连我们客户都来问中招了没
今天早上醒来,知名的Java日志组件Apache Log4j2就刷爆了圈子。它被发现了一个 0 Day 漏洞,该Log4J2 漏洞可以让黑客通过日志记录远程执行代码(Remote Code Execution)。由于这个日志库被普遍使用,而这个漏洞又非常容易使用,所以造成的风险也非常严重,让人不得不提高防范。就连不懂代码的客户都来问系统是否存在这个问题。
码农小胖哥
2021/12/15
1.1K0
知名Java日志组件Log4j2爆出严重0 day漏洞,连我们客户都来问中招了没
使用systemd,把服务装进 Linux 心脏里~
把服务跑在Linux上,就像男生把女装藏在密码箱里一样让人放心,它的稳定安全可以让人安稳的睡个懒觉。
xjjdog
2022/09/26
6740
【NIO】NIO实现HTTP服务器
NIO 实现的HTTP服务器 该版本只处理了静态资源,如需要处理动态资源可参考【BIO】基于BIO实现简单动态HTTP服务器 本篇文章的代码注释比较少,详细的NIO的工作流程可参考【NIO】NIO版本的鸿儒聊天室 /** * NIO实现HTTP服务器 * * @author futao * @date 2020/7/10 */ @Slf4j public class NioHttpServer { private static final ByteBuffer READ_BUFFER =
喜欢天文的pony站长
2020/07/16
1.1K0
【NIO】NIO实现HTTP服务器
Log4j爆核弹级漏洞,大厂中招、公司炸锅了...
出处:https://www.zhihu.com/question/505025655/answer/2265086040
纯洁的微笑
2021/12/13
5940
Log4j爆核弹级漏洞,大厂中招、公司炸锅了...
JavaHTTP心跳:服务器与客户端实时连接的实现方式
在网络通信中,实时连接是一种至关重要的功能。它允许服务器与客户端之间保持持久的通信信道,实现快速、高效的数据传输。对于Java开发者来说,实现服务器与客户端之间的实时连接可以通过JavaHTTP心跳技术来实现。本文将介绍如何利用JavaHTTP心跳来实现服务器与客户端之间的实时连接。
用户10354340
2023/08/07
6140
APM - 使用JavaAgent+Javassit 插桩C3P0
很熟悉吧,我们要插桩的这个对象就是 ComboPooledDataSource ,
小小工匠
2021/08/17
4670
压测分析Java内存和CPU暂用
压测(压力测试)是评估软件系统在极端工作负载下的性能和稳定性的一种测试方法。在进行Java应用的压测时,分析内存(Memory)和CPU(Central Processing Unit)的使用情况是非常重要的,因为这些资源往往是性能瓶颈的常见来源。下面我将提供一个简单的案例教学,介绍如何进行Java应用的内存和CPU使用分析。
七条猫
2024/10/14
1490
压测分析Java内存和CPU暂用
简单的 http 服务器
项目路径:https://github.com/windwant/windwant-demo/tree/master/httpserver-demo
WindWant
2020/09/11
1.8K0
BIO、NIO、IO多路复用模型的演进&Java NIO 网络编程
上文介绍了网络编程的基础知识,并基于 Java 编写了 BIO 的网络编程。我们知道 BIO 模型是存在巨大问题的,比如 C10K 问题,其本质就是因其阻塞原因,导致如果想要承受更多的请求就必须有足够多的线程,但是足够多的线程会带来内存占用问题、CPU上下文切换带来的性能问题,从而造成服务端崩溃的现象。怎么解决这一问题呢?优化呗,所以后面就有了NIO、AIO、IO多路复用。本文将对这几个模型详细说明并基于 Java 编写 NIO。
王二蛋
2024/01/18
7820
springboot 项目通过过滤器(Filter)实现白名单过滤以及拦截客户端请求服务接口进行统一日志记录的实现方式
具体输出什么内容,这里可以通过自己的业务需要来做不同的输出。我这里记录的是ip,请求参数,响应内容。
跟着飞哥学编程
2023/04/01
2.4K0
springboot 项目通过过滤器(Filter)实现白名单过滤以及拦截客户端请求服务接口进行统一日志记录的实现方式
见证历史了。。。
最近这两天 log4j2 的事情闹得是沸沸扬扬的,本来大叔我是两耳不闻窗外事,一心只敲圣贤码的,谁知,公司研发群的一则通知打破了本来的宁静。
永恒君
2022/12/06
5500
见证历史了。。。
Java IO 与 NIO:高效的输入输出操作探究
输入输出(IO)是任何编程语言中的核心概念,而在Java中,IO操作更是应用程序成功运行的基石。随着计算机系统变得越来越复杂,对IO的要求也日益增加。在本文中,我们将探讨Java IO和非阻塞IO(NIO)的重要性以及如何在Java中实现高效的输入输出操作。
程序那些事
2023/10/17
2590
使用Java实现简单的Http服务器
在Java中可以使用HttpServer类来实现Http服务器,该类位于com.sun.net包下(rt.jar)。实现代码如下:
布禾
2020/10/29
4.9K0
使用Java实现简单的Http服务器
Log4j史诗级漏洞,我们这些小公司能做些什么?
12月10日,看到朋友圈中已经有人在通宵修改、上线系统了。随即,又看到阿里云安全、腾讯安全部门发出的官方报告:”Apache Log4j2存在远程代码执行漏洞“,且漏洞已对外公开。
程序新视界
2021/12/13
5700
Log4j史诗级漏洞,我们这些小公司能做些什么?
【Java 网络编程】UDP 服务器 与 客户端持续交互 案例
1. UDP 单播传输流程 : A 给 B 发送数据包 , B 设备一定要处于监听 X 端口状态 , A 向 B 的 X 端口发送数据包 , B 才能收到 ; B 收到 A 的数据包后 , B 就知道了 A 的端口号 Z 的信息了 , 此时 B 可以向 A 的 Z 端口号发送数据包 ;
韩曙亮
2023/03/27
1.7K0
【Java 网络编程】UDP 服务器 与 客户端持续交互 案例
《Java-SE-第三十二章》之模拟实现HTTP服务器
HTTP服务器本质上也是一种应用程序,通常运行在服务器之上,绑定了服务器的ip地址和某些客户端,这些客户端一般是谷歌,edge,火狐等浏览器。当浏览器发送HTTP请求就可以通过该请求向服务器获得网络资源,而服务器上的HTTP服务器就是解析来自客户端的HTTP请求以及处理HTTP请求。下图就描述的就是这一过程。
用户10517932
2023/10/07
2910
《Java-SE-第三十二章》之模拟实现HTTP服务器
我鮳!Log4j2突发重大漏洞,我们也中招了。。
相信大家已经被 Log4j2 的重大漏洞刷屏了,估计有不少小伙伴此前为了修 bug 已经累趴下了。很不幸,我的小老弟小二的 Spring Boot 项目中恰好用的就是 Log4j2,版本特喵的还是 2.14.1,在这次漏洞波及的版本范围之内。
沉默王二
2021/12/13
1.2K0
我鮳!Log4j2突发重大漏洞,我们也中招了。。
基于 Java NIO 实现简单的 HTTP 服务器
本文是上一篇文章实践篇,在上一篇文章中,我分析了选择器 Selector 的原理。本篇文章,我们来说说 Selector 的应用,如标题所示,这里我基于 Java NIO 实现了一个简单的 HTTP 服务器。在接下来的章节中,我会详细讲解 HTTP 服务器实现的过程。另外,本文所对应的代码已经上传到 GitHub 上了,需要的自取,仓库地址为 toyhttpd。好了,废话不多说,进入正题吧。
田小波
2018/04/26
2.8K2
基于 Java NIO 实现简单的 HTTP 服务器
springcloud5-服务网关zuul及gateway
1,课程回顾 2,本章重点 zuul(zuul1,zuul2) gateway 3,具体内容 3.1 zuul 3.1.1 zuul简介 ​​​ https://www.springcloud.cc/​​​ https://github.com/Netflix/zuul/wiki https://www.springcloud.cc/spring-cloud-greenwich.html#_router_and_filter_zuul Zuul 是从设备和网站到 Netflix 流媒体应用程序后端的所有请求的前门。作为边缘服务应用程序,Zuul 旨在支持动态路由、监控、弹性和安全性。路由是微服务架构不可或缺的一部分。例如,/可能被映射到您的web应用程序,/api/users被映射到用户服务,/api/shop被映射到商店服务。 Zuul是Netflix的基于JVM的路由器和服务器端负载平衡器。 3.1.1 zuul 的主要作用(为什么使用) Netflix API 流量的数量和多样性有时会导致生产问题在没有警告的情况下迅速出现。我们需要一个允许我们快速改变行为以应对这些情况的系统。 Zuul 使用一系列不同类型的过滤器,使我们能够快速灵活地将功能应用到我们的边缘服务。这些过滤器帮助我们执行以下功能: 身份验证和安全性 - 确定每个资源的身份验证要求并拒绝不满足要求的请求。 洞察力和监控 - 在边缘跟踪有意义的数据和统计数据,以便为我们提供准确的生产视图。 动态路由 - 根据需要将请求动态路由到不同的后端集群。 压力测试 - 逐渐增加集群的流量以衡量性能。 减载 - 为每种类型的请求分配容量并丢弃超出限制的请求。 静态响应处理 - 直接在边缘构建一些响应,而不是将它们转发到内部集群 3.1.2 实现过程(参考项目 zuul) 1)引入jar:
张哥编程
2024/12/13
1360
springcloud5-服务网关zuul及gateway
推荐阅读
相关推荐
腾讯会议API - Webhook介绍与简单实现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验