|
演示四:支持“暂停/继续”的Windows NT 服务
工具:将 Jar 文件转换为 Exe 可执行文件。
第一部分:代码示例
1. 下载接口代码,放入 java 源程序目录中,并进行编译:
接口代码下载:[接口代码下载] - 4kb
2. 编写文件 D:\demo\DemoPauseService.java:
演示功能为:侦听一个端口,以1234为例,接受到请求后开启新线程处理服务。服务内容为:把 socket 收到的内容直接反馈回客户端。直到收到 'q' 服务结束:
package demo;
import java.io.*;
import java.net.*;
import java.util.*;
import com.regexlab.j2e.*;
public class DemoPauseService implements ServiceStatusHandler, Runnable
{
// 各个 Client 公用的静态变量
static Vector all_clients = new Vector();
static boolean is_paused = false;
// 每个 Client 单独使用的变量
PrintWriter out = null;
Socket socket = null;
// 对每个 Client 进行广播信息
static void broadcast(String msg)
{
for(int i=0; i<all_clients.size(); i++)
{
DemoPauseService client =
(DemoPauseService)all_clients.get(i);
client.out.println(msg);
client.out.flush();
}
}
// 构造函数,创建一个 Client
public DemoPauseService( Socket sock )
{
socket = sock;
}
// 告诉 Windows NT 服务管理器,是否要求支持“暂停/继续”
public boolean canPause() {
return true;
}
// 当被暂停时,这个函数将被 Windows NT 服务管理器调用
public boolean onPause() {
broadcast("--- PAUSED ---");
is_paused = true;
return true;
}
// 当被继续时
public boolean onContinue() {
broadcast("--- CONTINUED ---");
is_paused = false;
return true;
}
// 当被停止服务时,在停止之前
public boolean onStop() {
broadcast("--- STOPPED ---");
return true;
}
// 每个 Client 线程的执行函数
public void run()
{
try
{
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream())
);
out = new PrintWriter(socket.getOutputStream());
if( is_paused )
{
out.println("--- Service is PAUSED now ---");
out.flush();
return;
}
// 添加到 Vector ,使自己可以被广播到
all_clients.add(this);
// 欢迎信息
out.println("---- Welcome! Type 'q' to EXIT: ----");
out.flush();
// 服务内容
String line;
while( (line = in.readLine()) != null )
{
if( line.equalsIgnoreCase("q") )
break;
if( is_paused )
{
out.println("--- Service is PAUSED now. ---");
out.flush();
continue;
}
out.println(line);
out.println();
out.flush();
}
}
catch(Exception e)
{
e.printStackTrace(System.err);
}
finally
{
all_clients.remove(this);
try { socket.close(); } catch (Exception e) {}
}
}
// 启动函数
public static void main(String[] args) throws Exception
{
// 创建一个实例来接受事件
ServiceStatusManager.setServiceStatusHandler(
new DemoPauseService(null) // 作为 handler 使用,而不是Client
);
// 监听 1234
ServerSocket listen = new ServerSocket(1234);
System.out.println("Service started...");
while(true)
{
// 接受客户端,并开启线程
new Thread(new DemoPauseService(listen.accept())).start();
}
}
} |
第二部分:编译和运行
1. 参考“演示三”进行编译和运行。 2. 下载本例中的示例代码和示例结果:
[demopause.zip] - 23kb
更多演示:
演示一:如何用 Java 开发并生成一个 控制台程序?
演示二:如何用 Java 开发并生成一个 Windows 窗口程序?
演示三:如何用 Java 开发服务并作为 Windows NT 服务运行?
演示五:系统任务栏图标和系统日志
|
|
|