产品首页

使用说明

典型示例

下载

购买

技术支持

信息反馈

 

演示四:支持“暂停/继续”的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 服务运行?

演示五:系统任务栏图标和系统日志

 

 

RegExLab.com © 2005 -   渝ICP备05015140号