基于xmlrpc的远程控制管理

前段时间在做一个日终系统(统一管理所有客户端系统中各定时任务的一个系统)时,实现了其中一个远程管理客户端程序运行状态的模块。这里写出来与大家共享,如有不足之处,希望大家指出共同探讨完善!
在这个远程控制的模块中,对其的基本的需求如下:
· 启动/终止等远程客户端系统中指定的程序;
· 请求要异步,不能占用服务端系统(即日终系统)的资源,即启动客户端程序之后,就与客户端断开连接,让客户端自己运行;
· 可以随时查看指定客户端的指定程序的运行状态,便于监控;
· 如果客户端程序有发生线程死琐、无法连接服务等环境异常时,能够自动预警(即实时监控);
· 程序执行过程中(包括执行成功后)各种对应的状态可以返回到服务端;

根据上面的需求,首先想到的是这个模块的结构将是服务器/客户端模式。考虑使用这种模式的设计,则接下来应该考虑选择什么样的远程方式。当然,如果自己实现一个远程连接功能,小弟自认为能力还不足,呵呵,所以不得不从现有的远程连接方式中选择一个作为自己远程连接的基础。
在对比各种远程方式的对比中,我发现两种远程技术满足我的要求(可以用于异构系统间、调用方式灵活、使用上可以无限扩展):xmlrpc和JMX。
再继续对比这两种技术的优缺点:
优点:
 xmlrpc:配置简单、使用方便;
 JMX:JDK中自带的,因此不需要第三方jar包支持即可使用;同时也可以动态加载/卸载客户端bean(这是我最想要的功能)
缺点:
 xmlrpc:需要第三方jar包支持;
 JMX:需要服务端开通相应的端口支持,因此可能会存在很大的安全隐患;
对比上面主要、简单的优缺点之后,考虑到在企业应用中安全问题往往是占优先位置的,而且最主要的是,JMX在企业应用的发布时,需要开端口,这个过程挺痛苦的。因此,这里不得不摒弃JMX(虽然我也用JMX验证并实现了整个模块的控制功能)。
在选择了xmlrpc为远程连接的工具之后,就着手设计整个结构了:

整体设计
从使用角度来划分其总体设计:先在服务端发起一个操作请求,传输到客户端,客户端作相应的响应,然后将操作的最终结果返回服务端,便于服务端的后续操作。在额外的角度来说,还有一个实时监控功能。从这里来看,由于在请求方面来说,服务端与客户端都相互有信息传递的功能,因此,这里的整体分为三个模块:服务端——公共端——客户端。
其总体设计的UML图如下:

 

 

在上图中,灰色表示服务端的系统(即日终系统)、深蓝色表示服务端模块、淡黄色表示公共模块、桔黄色表示客户端模块、青色表示客户端系统。其中,灰色和青色是在具体使用时的结合部分。真正的该远程控制模块的部分为:深蓝色、淡黄色和桔黄色。

详细设计
服务端模块
在服务端模块中主要的功能是主动发起请求与实时监控!这两个类分别是OssXmlrpcClientFactory、OssListenClientStatusExcutor。
OssXmlrpcClientFactory类主要是提供对客户端操作的主要一些接口,当然,也有方便扩展的接口。
在上面的代码中,其方法中主要提供了常用的操作!再看监听程序:OssListenClientStatusExcutor。从其中的代码(见附件中的代码)也可以看出,这里是监控指定的客户端系统中指定的方法。
客户端模块
在客户端需要说明客户端受控程序遵守的规则,即需要继承OssXmlClientSupport类,表示该类接受服务端的控制,也就是相当于接受协议一样,这样可以防止一些不愿意被控制的类也被误控!
为了将程序执行的状态返回到服务端,客户端需要一个执行回返状态的功能类:ConnectServerExcutor。
这两个类的详细功能请参考代码!
公共模块
除了上面两个模块所说的功能以外,其余的功能(如:线程管理、远程连接响应处理等)都属于公共模块中内容,这一模块在客户端/服务端都需要!
在这个模块中,重要的类有如下:
· OssXmlrpcRemoteExcutor。这是远程响应的类。
· OssXmlrpcServlet。这是初始化OssXmlrpcRemoteExcutor到xmlrpc的环境中以及将每次远程请求转为单例模式。xmlrpc执行时是需要将被调用的类的信息存放到它的容器中,这里有比较详细的说明:http://former.iteye.com/blog/223673,我这里因为只需要通过OssXmlrpcRemoteExcutor作为“网关”,因此我因需要将它加入到xmlrpc中即可,其关键代码如下:

mapping.load(Thread.currentThread().getContextClassLoader(), getDefaultProps());
……
     /**
  * 将提供服务的类,从系统中加载进来
  */
 protected Properties getDefaultProps() {
  Properties props = new Properties();
  props.put(OssXmlrpcRemoteExcutor.class.getSimpleName(), OssXmlrpcRemoteExcutor.class.getName());
  return props;
 }

 

使用说明
服务端系统
1、环境配置
· 加载xmlrpc的三个jar包。
· 服务端需要实现:OssXmlrpcRemoteResponse接口的类。如果不是Spring容器的话,需要重新实现FindInstanceClass接口并在OssXmlrpcUtils中重新指定。
· 由于需要接受客户端传递回来的请求,因此需要在web.xml中配置如下:

 <servlet>
  <servlet-name>XmlRpcServlet</servlet-name>
  <servlet-class>com.cloudtech.xmlrpc.common.OssXmlrpcServlet
  </servlet-class>
 </servlet>
 <servlet-mapping>
  <servlet-name>XmlRpcServlet</servlet-name>
  <url-pattern>/xmlrpc</url-pattern>
 </servlet-mapping>

 
2、初始化
这里的初始化其实是初始化两个内容:远程连接的连接配置信息,即xmlrpc远程配置信息;监听程序。具体的初始化方式示例如下:

import java.net.URL;

import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;

import com.cloudtech.xmlrpc.common.OssXmlrpcPoolManager;
import com.cloudtech.xmlrpc.server.OssListenClientStatusExcutor;

public class OssXmlrpcRemoteInit {
	public void init() {
		// TODO 如果不希望影响系统启动速度,可以启用新线程执行下面的过程
		initRemote();
		initListener();
	}

	/**
	 * 初始化监听器
	 */
	protected void initListener() {
		// TODO 先初始化需要监听的程序,这里就不实现了
		OssListenClientStatusExcutor.startListen();
	}

	/**
	 * 初始化远程连接。
	 */
	protected void initRemote() {
		XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
		try {
			// 连接到客户端。
			config.setServerURL(new URL("http://tfc.vemic.com:8081/xmlrpc"));// 这里是客户端的xmlrpc配置
			config.setEnabledForExtensions(true);
			config.setEnabledForExceptions(true);
			config.setBasicEncoding("GBK");
			config.setConnectionTimeout(30000);
			config.setContentLengthOptional(false);
			config.setReplyTimeout(0);
			OssXmlrpcPoolManager.createXmlRpcClient("localhost", config);// 这是连接池管理类。
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 
客户端系统
1、环境配置
· 加载xmlrpc三个jar包。
· 加载远程控制模块的公共模块包、客户端模块包。
· 由于需要被服务端连接操作,因此需要对外提供xmlrpc远程服务,因此需要在web.xml中配置如下:
 

<servlet>
  <servlet-name>XmlRpcServlet</servlet-name>
  <servlet-class>com.cloudtech.xmlrpc.common.OssXmlrpcServlet
  </servlet-class>
 </servlet>
 <servlet-mapping>
  <servlet-name>XmlRpcServlet</servlet-name>
  <url-pattern>/xmlrpc</url-pattern><!-- 注意这里的配置与上面的代码的客户端连接的对应关系 -->
 </servlet-mapping>

 
· 为了将执行的状态返回到服务端,这里还需要配置ConnectServerExcutor类到系统环境中(如果该类中的默认值与服务端的配置是一致的,则倒可以不需要配置),其配置示例:
 

 <bean class="com.cloudtech.xmlrpc.client.ConnectServerExcutor">
  <property name="serverURL" value="http://tfc.vemic.com/xmlrpc" />
 </bean>

2、编写代码
接下来就可以使用它的控制功能了:

import org.springframework.stereotype.Service;

import com.cloudtech.xmlrpc.client.OssXmlClientSupport;

@Service
public class OssTriggerDemo extends OssXmlClientSupport {//注意这里继承了OssXmlClientSupport
 public void execute() {
  System.err.println("executeDemo...");
  for (int i = 1; true; i++) {
   System.out.println("第" + i + "次循环!");
   try {
    Thread.sleep(100);
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
  }
 }
}

 注意:上面的@Service是使用Spring的注解将该类扫描到Spring容器中去,这样“网关”类OssXmlrpcRemoteExcutor就可以通过Spring获取到该类。
3、控制演示
在服务端,发起控制请求:

 public void testRemote() {
  try {
   OssXmlrpcClientFactory.execute("localhost", "OssTriggerDemo.execute");
  } catch (OssXmlrpcException e) {
   e.printStackTrace();
  }
 }

 
说明
· 如果需要认证,则可以在OssXmlrpcServlet、ConnectServerExcutor有对应的用户名、密码设置。
· 客户端受控的类需要加载到环境中,或者,可以重新实现接口FindInstanceClass来获取到指定类的实例化。

结语
· 这是一开始的雏形,现在应用于公司的日终系统中之后,有些地方已经完善过了,具体改的地方也不记得了……
· 由于能力有限,写出的也点这个水平了,希望大家能够给出建议完善它!

phpStudy供应链攻击深度解析:从后门原理到安全自查与防护 供应链攻击是一种通过污染软件分发渠道来大规模感染目标系统的攻击方式,其核心在于攻击者并非直接攻击终端用户,而是利用软件供应商或分发环节的信任关系植入恶意代码。这种攻击的原理在于利用软件更新、安装包等合法流程的自动化执行机制,将恶意组件伪装成正常模块,在用户不知情的情况下获得系统权限。从技术价值看,理解供应链攻击有助于开发者建立纵深防御思维,不仅关注应用层漏洞,更要重视基础设施和软件来源的可信性。在PHP开发环境中,集成工具如phpStudy因其便捷性被广泛使用,但也因此成为供应链攻击的高价值目标。本文聚焦于 阅读详情

相关推荐

WordPress中xmlrpc.php完整指南(功能、安全风险、如何禁用)

XML-RPC是支持WordPress与其他系统之间通信的规范。它通过使用HTTP作为传输机制和XML作为编码机制来标准化这些通信来实现此目的。XML-RPC早于WordPress:它出现在b2博客软件中,该软件于2003年创建了WordPress。该系统的代码存储在站点根目录下的xmlrpc.php文件中。即使XML-RPC在很大程度上已经过时,它仍然存在。在WordPress的早期版本中,默认情况下已关闭XML-RPC。但是从3.5版开始,默认情况下已启用它。

欢迎来到鸾姝淡月博客,专为程序员和编程爱好者打造的技术博客。我们分享编程语言趋势、开发工具、编程哲学、职业发展等,助你掌握新技术,优化技能,激发编程热情。 2447

2022idea报错快速解决方法图解:Invocation error: unable to read askpass response from ‘C:\Users\QKN\AppDat

idea git无法拉代码,提交代码,报错快速解决方法:Invocation error: unable to read askpass response from 'C:IUsersQKNIAppDataNLocalN Caused by: java.io.IOException: Server returned invalid Response.

andybob1的博客 1199

Android使用XML-RPC实现blog客户端源码

能在Android系统中运行的, 使用XML-RPC实现csdn blog客户端(其它blog客户端可以通过修改源码实现),可以独立编译成功的源代码

xml rpc是什么

1.xml rpc是什么1.1. xml rpc简介xml rpc是使用http协议做为传输协议的rpc机制,使用xml文本的方式传输命令和数据。一个rpc系统,必然包括2个部分:1.rpc client,用来向rpc server调用方法,并接收方法的返回数据;2.rpc server,用于响应rpc client的请求,执行方法,并回送方法执行结果。1.2. xml rpc的可用版本xml

Spring 的专栏 1万+

python——模拟砍价

类型:随机数。

m0_62488776的博客 1972

OpenCV实战:5分钟搞定图像拼接(附Python代码)

本文通过OpenCV实战教程,详细讲解如何使用Python在5分钟内完成图像拼接。重点介绍`findHomography`函数和单应性矩阵的应用,提供完整的代码示例和常见问题解决方案,帮助开发者快速掌握图像拼接技术。

weixin_26833503的博客 121

Apache-XMLRpc客户端连接不关闭问题解决

在使用Apache XML-RPC客户端时,采用默认的XmlRpcCommonsTransportFactory创建连接时,会出现客户端已经做完请求操作,但是系统中的该连接资源没释放。通过两点可以明显观察到现象:           1. 在系统中通过netstat -anop|grep 9843|grep ESTABLISHED,发现有一些连接仍然建立着;           2. 通过使用

卡索 2244

拆开一个烧坏的IGBT模块,手把手教你识别过压、过流、过温的“案发现场”

本文详细解析了IGBT模块失效分析的实战技巧,通过观察铝层熔化纹路、焊锡溢出形态等物理痕迹,手把手教你识别过压、过流、过温的典型失效模式。文章提供了从基础工具包到现场快速诊断的完整流程,帮助工程师精准定位IGBT模块失效的根本原因。

weixin_30655569的博客 427

idea连接coding(或者gitee之类)失败,无法对远程库操作

刚开始用coding时候,发现idea连不上coding,克隆项目一直报gitee的错误

lengleng0107的博客 1763

《21天学通C++》阶段性成果测试题——hstring(手写string类)

总体考察了类的使用,缓冲区考察了指针和数组的使用、增删改查、考察编码思维、考察了类的重载。1.初始化子字符串的起始位置为-1,表示未找到,若buffer或findHstring为空,则返回-1。右边的字符串不为空,则分别获取母串和子串的长度(用循环),然后创建一个固定大小的数组。3.然后循环遍历寻找子串在母串中的起始位置,循环时可以通过两个长度相减,避免循环越界。2.如都不为空,则分别获取双方的字符串长度(用循环),然后。右边的字符串为空,则输出原来的字符串。是否为空,有一方为空则返回另一方。

立志成为炼丹师? 1265

Tessent_StdcellLib

第二种为 Tessent Cell lib,既可用于功能仿真,也可以用于测试逻辑插入。lib包含了用于仿真的功能信息,也包含DFT cell属性。如何使用tessent工具将stdcell verilog 仿真模型转换为tessent自己的lib。运行后工具会生成一个atpg的lib文件,打开文件,找到一个带SI的DFF,只有功能描述。tessnt lib分为两种,第一种为ATBG lib,可以用于仿真;打开生成的lib文件,多了dft_cell_selection。第二部:编写attributes文件。

qq_40411444的博客 2135

通过XMLRpc控制海康VB2200视觉控制器自带光源接口

在使用Hik VB2200视觉控制器时,由于并未使用VisionMaster软件,但是使用了视觉控制器的光源接口。导致无法直接控制该光源接口。VB2200视觉控制器提供了一个IOController应用程序,其中对应的exe文件可以设置为对应光源接口的亮度等参数,基本满足需求。但是IOController只能设置对应的参数,当我们用该控制器时一般都是跑一些自动化程序,并不能每次都来点击IOController的界面来实现光源的控制。

好奇怪o的博客 1750

硬件学习手册【总目录】

欢迎大家来到《硬件学习手册》,专栏主要包括 《硬件经验手册》《电子元器件器件手册》《PCB手册》《CPU手册》《元器件选型手册》五个分册。在开始专栏的更新前,博主先列出专栏的大纲,以供大家参考。大家直接点击大纲中的蓝色标题即可轻松传送。

fydar的博客 5859

开源EAI产品-Retic Server

Retic Serverhttp://retic.sourceforge.net/xmlrpc_server.htmJpython编写,开源项目It is a process that provides XMLRPC services to launch adaptors.It can be fully controlled remotely by Retic Administrator (e

叮叮咚咚 1869

「JS逆向三百例」JS逆向HIKVISION-视频监控的前端密码加密

本文详细分析了HIKVISION-海康威视监控前端登录过程中密码的加密机制,通过逆向工程解析了其 JavaScript 加密逻辑,重点研究了HIKVISION-海康威视监控的前端密码SHA256加密算法的实现。基于逆向分析结果,使用 Python 模拟了HIKVISION-海康威视监控的登录流程,最终实现了自动化登录功能。本文旨在为安全研究人员提供技术参考,帮助理解前端加密机制,并强调技术研究的合法性和合规性。

布啦啦 1100

Winform从入门到精通(2)——Button(史上最全)

本文介绍winform中Button控件的详细用法,包括所有属性和事件

qq_34059233的博客 1万+

用python程序自动更新wordpress网站文章

仅需200多行代码,网站变成机器人儿。用wordpress搭建的网站可以用程序控制完成自动采集信息,并自动上传更新。如果外部条件不变化(比如数据来源),理论上wordpress制作的网站可以在无人值守的状态下一直自转下去。程序用python写成,需要安装第三方包wordpress_xmlrpc。 以下是我们为某网站定制的自更新程序代码,仅是数据上传部分。供参考. #coding:utf-8 本程序实现在www.okinawa-newlife.com网站自动发帖,别的wordpress网站可套用。 from

eud19的博客 867

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

如何通过SCGI远程控制rTorrent:完整配置教程

想要远程管理你的rTorrent下载任务吗?SCGI(Simple Common Gateway Interface)提供了一个简单高效的解决方案。作为rTorrent的核心功能之一,SCGI允许你通过Web界面或其他客户端程序远程控制和管理下载任务,让BT下载管理变得更加灵活便捷。😊 ## 什么是SCGI远程控制 SCGI是rTorrent支持的多种RPC(远程过程调用)协议之一,它通过U

gitblog_01186的博客 1026

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

rtorrent 的安装、使用

rtorrent 是什么 这是一个 PT 下载工具,和大家熟知的 utorrent、vuze、transmission 属于同类的产品。其优点 / 特点是: 被广大国内外 PT 网站所接受,包括馒头、ttg、ipt 等 自身仅支持 CLI,即命令行界面,对一些没有图形操作界面的系统比较友好 有配套的远程控制指令,也有配套的 GUI,支持直观的用户操作 支持程序控制,可以实现一定程度的自动化 ...

平头 5万+

Android源码备用

1.Android团队提供的示例项目 如果不是从学习Android SDK中提供的那些样例代码开始,可能没有更好的方法来掌握在Android这个框架上开发。由Android的核心开发团队提供了15个优秀的示例项 目,包含了游戏、图像处理、时间显示、开始菜单快捷方式等。 地址:http://code.google.com/p/apps-for-android/ 附件: Amazed2_...

wangxiaohigh 100

Phpstudy后门文件分析

PhpStudy是什么 PhpStudy软件是国内的一款免费的PHP调试环境的程序集成包,通过集成Apache、PHP、MySQL、phpMyAdmin、ZendOptimizer多款软件一次性安装,无需配置即可直接安装使用,具有PHP环境调试和PHP开发功能,在国内有着近百万PHP语言学习者、开发者用户。 ​ 后门供应链攻击活动揭露 ...

CSD15138668634的博客 1012

10个值得深入的Android应用开源项目

<br />Android开发又将带来新一轮热潮,很多开发者都投入到这个浪潮中去了,创造了许许多多相当优秀的应用。其中也有许许多多的开发者提供了应用开源项 目,贡献出他们的智慧和创造力。学习开源代码是掌握技术的一个最佳方式。下面推荐几个应用开源项目,这些项目不仅提供了优秀的创意,也可以直接掌握 Android内核的接口使用:<br />1.Android团队提供的示例项目<br />如果不是从学习Android SDK中提供的那些样例代码开始,可能没有更好的方法来掌握在Android这个框架上开发。由And

wukunting的专栏 1752

10个经典的Android开源应用项目- android入门

Android开发又将带来新一轮热潮,很多开发者都投入到这个浪潮中去了,创造了许许多多相当优秀的应用。其中也有许许多多的开发者提供了应用开 源项目,贡献出他们的智慧和创造力。学习开源代码是掌握技术的一个最佳方式。下面推荐几个应用开源项目,这些项目不仅提供了优秀的创意,也可以直接掌

chuck_sun的专栏 649

Printrun开源3D打印控制套件:如何实现跨平台高效打印管理

Printrun是一款基于Python开发的**开源3D打印控制软件**,为3D打印爱好者和专业用户提供从模型准备到打印执行的完整解决方案。这套软件包含Pronterface图形界面、Pronsole命令行工具和Printcore核心库三大组件,支持Windows、macOS和Linux系统,解决了传统3D打印软件功能分散、兼容性差的痛点。 ## 🔍 传统3D打印控制软件的三大痛点 在Pri

gitblog_00713的博客 765
上一篇: Hibernate中自定义数据库函数
下一篇: 基于java反射的验证框架
hellohank
博客等级 码龄19年 0粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值