上一篇:深入浅出Java设计模式之状态模式 >>
将Java程序变成Windows系统服务
| 天极软件专题专区精选 到天极软件“读编交流区”畅所欲言 | |||
| Google专区 | POPO专区 | QQ专区 QQ挂机 | 了解Web2.0 |
| Flash MX 视频教程 | Photoshop视频教程 | 网页设计视频教程 | 照片处理数字暗房 |
| PPT动画演示教程 | Excel动画教程集 | Word动画演示教程 | Windows Vista专区 |
| 特洛伊木马专区 | 黑客知识教程专区 | 防火墙应用专区 | 注册表应用专区 |
| Windows API开发专区 | 网络编程专区 | VB数据库编程专区 | 图像处理与多媒体编程 |
近买了一台机器做个source服务器和异地的几个朋友一起做点东西玩玩。但是由于用的是电信的ADSL,所以地址是动态的,每天机器自动重起的时候就会变化。于是我就用3322的域名绑定,但是3322提供的windows更新dns的客户端运行时不是作为系统服务运行的,所以没有用户登录时它是没有运行的,所以还是没有解决问题。后来下了一个Windows Resource Kit Tools(这个工具windows server默认是没有的,需要到微软的网站上下载,具体地址我没有记住,google一下肯定能找到),里面有一些工具可以把普通的win32程序变成系统服务。
instsrv: 这个工具是把win32程序变成系统服务,但是并不是所有程序都适合做系统服务的,如CN99的客户端,注册成系统服务后就是无法启动的。
基本用法:instsrv [服务名] [应用程序绝对路径]
srvany: 这个工具就是用来解决上面的工具中的问题,你注册的时候把它当作你要的服务,在用它来启动你的应用程序。
instsrv [服务名] [srvany的绝对路径]
注册成功后,到服务管理器中把刚才注册的服务打开,在启动参数中填上你的应用程序绝对路径,启动服务就可以了。
这种方式可以解决更新域名地址的问题了。
但是心里不爽,作为一个程序员如此受制于人总是不爽的,其实CN99的动态域名更新协议很简单,编个简单的程序就实现的。无奈只会Java,对于C或C++程序员来说,做一个系统服务实在是小Case啊,后悔当初没有好好学C和C++。但是难道就没有办法把Java程序变成windows系统服务吗?在Java的世界里基本上是没有不可能的事,ObjectWeb Forge上有个项目叫JavaService就是用来把Java程序注册成系统服务的。于是下来看了一下:
一试--失败
二试--不成功
三试--...
...
...
放弃!
老子自己做了,其实有了上面的instsrv和srvany其实就差一个可执行文件了。于是我用JBuilder把我的jar包做成了一个假的exe文件。
我的DNS更新程序如下:
| package org.mstar.dns; import java.util.TimerTask; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.HttpException; import java.io.IOException; import java.util.*; import org.apache.commons.logging.*; import org.apache.commons.httpclient.Credentials; import org.apache.commons.httpclient.UsernamePasswordCredentials; import org.apache.commons.httpclient.auth.AuthScope; import java.text.SimpleDateFormat; public class Refresher { private static Log LOG = LogFactory.getLog(Refresher.class); public Refresher() { Timer timer = new Timer(); timer.schedule(new RefreshTask(), 0, 60000); } class RefreshTask extends TimerTask { static final String URL ="http://members.3322.org/dyndns/update?system=dyndns&hostname=zjumty.3322.org"; public void run() { HttpClient client = new HttpClient(); client.getParams().setAuthenticationPreemptive(true); Credentials defaultcreds = new UsernamePasswordCredentials("username", "password"); //此处我要保密 client.getState().setCredentials(new AuthScope("members.3322.org", 80, AuthScope.ANY_REALM), defaultcreds); GetMethod method = new GetMethod(URL); try { int statusCode = client.executeMethod(method); if (statusCode != HttpStatus.SC_OK) { LOG.error("Method failed: " + method.getStatusLine()); } Date date = Calendar.getInstance().getTime(); SimpleDateFormat fmt = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); byte[] responseBody = method.getResponseBody(); LOG.info(fmt.format(date) + " -- " + new String(responseBody)); } catch (HttpException e) { LOG.error("Fatal protocol violation: " + e.getMessage()); e.printStackTrace(); } catch (IOException e) { LOG.error("Fatal transport error: " + e.getMessage()); e.printStackTrace(); } finally { method.releaseConnection(); } } } public static void main(String[] args) { Refresher refresher = new Refresher(); } } |
其实就是用Jakarta的HttpClient来请求一个URL就可以了。
于是我现在有了我的Refresher.exe。当然你的系统上一定要有JVM才能运行(废话)。为了运行方便我是把运行时的jar包,如logger.jar,httpclient.jar等打在我的jar包里了。
接下来就是把它搞成系统服务了。
第一步:instsrv Refrehser C:\Program Files\Windows Resource Kits\Tools\srvany.exe
第二步:regedit打开注册表
第三步:进入HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Refrehser
第四步:右键-新建-项 填入 Parameters
第五步:打开Parameters,右键-新建-字符串值 Application
第六步:双击Application 填入 c:\refresher.exe
弟七步:启动Refresher服务。
一切都OK了。
在Parameters里还可以添加很多键值:
AppDirectory 工作目录
AppParameters 你的应用程序的参数。(我可以把我上面程序做成可以接受参数的,就更通用了)
AppEnvironment 运行环境变量。
值现在作为Java程序员的你也可以为自己系统添加一些动能了,赶快去做吧!
|
编辑推荐: |
下一篇:Java语言入门级的十二大特色详细介绍 >>
相关文章:
- · ASP.NET 2.0移动开发入门之使用模拟器
- · 在ASP.NET中自动给URL加上超链接
- · ASP.NET Atlas对JavaScript的扩展
- · ASP.NET Atlas简单控件介绍之两个基类
- · ASP.NET Atlas简单控件介绍之四大控件
- · ASP.NET页面中标题单点解决方案
- · ASP.NET2.0导航功能之配置会员和角色
- · 在ASP.NET程序中实现语音合成
- · ASP.NET入门随想之吸星大法
- · 抢先试用ASP.NET 2.0中的新型安全控件
- · ASP.NET入门随想六之大航海家
- · ASP.NET2.0应用中定制安全凭证之理论篇
- · ASP.NET2.0应用中定制安全凭证之实践篇
- · ASP.NET入门随想之抽象的力量
- · 一道Google中国挑战赛竞赛题的解法
- · ASP.NET入门随想之开卷有益
- · ASP.NET入门随想之瘦子与胖子的故事
- · .NET 2.0远程传输数据集的优化方法
- · 英特尔:对驱动程序软件漏洞没必要担忧
- · 苹果发布Mac OS升级版 修复60个软件瑕疵
- · 边走边看 手机应用软件开发平台介绍
- · Windows Mobile 5.0最新体验
- · 解读VC++编程中的文件操作API和CFile类
- · 利用VC++实现局域网实时视频传输
- · 使用VC6.0实现窗口的任意分割
- · 抢占网络工具焦点阵地 几大浏览器纷纷变脸
- · 双缓冲技术及其在VC的GDI环境下的实现
- · VC++实现动画弹出/弹入式窗口
- · VC++中实现以复杂线条为基础的图形绘图
- · VC++实现工具栏上添加平面组合框控件
- · C++箴言:考虑支持不抛异常的swap
- · Visual C++实现对计算机远程监控
- · VC与Matlab接口编程之Matcom安装配置
- · VC++中使用图形程序设计和动画技术
- · VC环境下三菱PLC与微机的串行通信
- · 在MFC下如何定义全局变量和全局函数
- · 用Visual C++实现排序算法大全
- · 辞旧迎新 WinFS未来的文件存储系统
