JAVA實現發送命令到指定端口關閉程序

在操做系統中,有一些應用程序是之後臺服務形式運行的,如Mysql程序等,windows提供服務管理器,能夠很方便地啓動和中止一個服務。JAVA程序也能夠包裝成服務程序,像Tomcat那樣,經過腳本程序很容易啓動和中止tomcat服務。Apache Common Daemon能夠實現把一個JAVA程序包裝成後臺服務的功能。中止一個在後臺運行的JAVA程序有不少方法,一種簡單的方法是找到該程序的PID,直接用kill命令把進程殺死。另外一種簡單方法是在程序啓動後監聽一個指定端口,須要中止程序時,經過TCP協議向該端口發送關閉命令便可。示例以下:java

  • 服務端程序,模擬正在後臺運行的JAVA程序
/**
 - 本程序模擬一個不斷輪詢消息隊列,從消息隊列中取出消息,而後執行業務的程序,
 - 程序啓動後監聽8888端口,當收到「stop」命令時,退出程序
 */
public class BackgroundApp {
    private static boolean forceExit = false;

    /**
     * 監聽8888端口,當收到「stop」命令時,退出程序
     */
    private static void startMoniter() {
        ServerSocket server = null;
        BufferedReader br = null;
        try {
            server = new ServerSocket();
            server.bind(new InetSocketAddress("127.0.0.1", 8888));
        } catch (Exception e) {
            System.out.println("綁定端口失敗");
        }
        try {
            while(true){
                Socket sock = server.accept();//這裏會阻塞,直到收到命令
                sock.setSoTimeout(1000); //本地通訊設置較短期
                br = new BufferedReader(new InputStreamReader(sock.getInputStream()));
                String readContent = br.readLine();
                System.out.println("接收到的內容是:"+readContent);
                // 判斷收到信息是不是中止標誌
                if ("stop".equals(readContent)) {
                    System.out.println("應用程序準備中止");
                    forceExit = true;//修改變量值,退出程序
                }
                br.close();
                sock.close();
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

    private static class MessageHandler implements Runnable{
        @Override
        public void run() {
                while(!forceExit){
                    try{
                        //1.從消息隊列中取出數據
                        //2.根據消息內容,執行相應業務
                        System.out.println("處理業務中...");
                        Thread.sleep(1000);
                    }catch (Exception e) {
                        //donothing
                    }
                }
            System.out.println("應用程序中止成功");
            System.exit(0);//關閉程序,退出JVM
        }
    }

    public static void main(String[] args) {
        Thread workThread = new Thread(new MessageHandler());
        workThread.start();//工做線程開始工做
        startMoniter();//開啓監聽器,用於關閉程序
    }
}
  • 客戶端程序,用於向服務端程序發送關閉命令(stop)
public class AppCloseHelper {
    public static void main(String[] args) {
        String targetHost = "127.0.0.1";
        int targetPort = 8888;
        try {
            Socket socket = new Socket(targetHost, targetPort);
            PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(
                    socket.getOutputStream())));
            pw.println("stop");//發送中止命令
            pw.flush();
            socket.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

控制檯輸出的內容爲:sql

處理業務中...
處理業務中...
處理業務中...
接收到的內容是:stop
應用程序準備中止
應用程序中止成功apache

經過向指定端口發送命令來實現關閉程序,實現比較簡單,但安全性不高,若是被別人知道了這個端口以及關閉命令,就能夠隨時關閉正在運行的程序了。windows

相關文章
相關標籤/搜索