亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

JAVA實現(xiàn)發(fā)送命令到指定端口關(guān)閉程序

劉德剛 / 1627人閱讀

摘要:可以實現(xiàn)把一個程序包裝成后臺服務(wù)的功能。另一種簡單方法是在程序啟動后監(jiān)聽一個指定端口,需要停止程序時,通過協(xié)議向該端口發(fā)送關(guān)閉命令即可。

在操作系統(tǒng)中,有一些應(yīng)用程序是以后臺服務(wù)形式運(yùn)行的,如Mysql程序等,windows提供服務(wù)管理器,可以很方便地啟動和停止一個服務(wù)。JAVA程序也可以包裝成服務(wù)程序,像Tomcat那樣,通過腳本程序很容易啟動和停止tomcat服務(wù)。Apache Common Daemon可以實現(xiàn)把一個JAVA程序包裝成后臺服務(wù)的功能。停止一個在后臺運(yùn)行的JAVA程序有很多方法,一種簡單的方法是找到該程序的PID,直接用kill命令把進(jìn)程殺死。另一種簡單方法是在程序啟動后監(jiān)聽一個指定端口,需要停止程序時,通過TCP協(xié)議向該端口發(fā)送關(guān)閉命令即可。示例如下:

服務(wù)端程序,模擬正在后臺運(yùn)行的JAVA程序

/**
 - 本程序模擬一個不斷輪詢消息隊列,從消息隊列中取出消息,然后執(zhí)行業(yè)務(wù)的程序,
 - 程序啟動后監(jiān)聽8888端口,當(dāng)收到“stop”命令時,退出程序
 */
public class BackgroundApp {
    private static boolean forceExit = false;

    /**
     * 監(jiān)聽8888端口,當(dāng)收到“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); //本地通信設(shè)置較短時間
                br = new BufferedReader(new InputStreamReader(sock.getInputStream()));
                String readContent = br.readLine();
                System.out.println("接收到的內(nèi)容是:"+readContent);
                // 判斷收到信息是否是停止標(biāo)志
                if ("stop".equals(readContent)) {
                    System.out.println("應(yīng)用程序準(zhǔn)備停止");
                    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.從消息隊列中取出數(shù)據(jù)
                        //2.根據(jù)消息內(nèi)容,執(zhí)行相應(yīng)業(yè)務(wù)
                        System.out.println("處理業(yè)務(wù)中...");
                        Thread.sleep(1000);
                    }catch (Exception e) {
                        //donothing
                    }
                }
            System.out.println("應(yīng)用程序停止成功");
            System.exit(0);//關(guān)閉程序,退出JVM
        }
    }

    public static void main(String[] args) {
        Thread workThread = new Thread(new MessageHandler());
        workThread.start();//工作線程開始工作
        startMoniter();//開啟監(jiān)聽器,用于關(guān)閉程序
    }
}

客戶端程序,用于向服務(wù)端程序發(fā)送關(guān)閉命令(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");//發(fā)送停止命令
            pw.flush();
            socket.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

控制臺輸出的內(nèi)容為:

  

處理業(yè)務(wù)中...
處理業(yè)務(wù)中...
處理業(yè)務(wù)中...
接收到的內(nèi)容是:stop
應(yīng)用程序準(zhǔn)備停止
應(yīng)用程序停止成功

通過向指定端口發(fā)送命令來實現(xiàn)關(guān)閉程序,實現(xiàn)比較簡單,但安全性不高,如果被別人知道了這個端口以及關(guān)閉命令,就可以隨時關(guān)閉正在運(yùn)行的程序了。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/64022.html

相關(guān)文章

  • Java必知必會之socket

    摘要:上,數(shù)據(jù)按有限大小的包傳輸,這些包成為數(shù)據(jù)報,每個數(shù)據(jù)報包含一個首部和一個有效載荷。不過,由于數(shù)據(jù)報長度有限,通常必須將數(shù)據(jù)分解為多個包,再在目的地重新組合。這兩個構(gòu)造函數(shù),在返回之前會與遠(yuǎn)程主機(jī)建立一個活動的網(wǎng)絡(luò)連接。 Internet上,數(shù)據(jù)按有限大小的包傳輸,這些包成為數(shù)據(jù)報(datagram),每個數(shù)據(jù)報包含一個首部(header)和一個有效載荷(payload)。首部包含包發(fā)...

    jackzou 評論0 收藏0
  • 慕課網(wǎng)_《Java消息中間件》學(xué)習(xí)總結(jié)

    摘要:時間年月日星期六說明本文部分內(nèi)容均來自慕課網(wǎng)。這個時候,可以啟動多臺積分系統(tǒng),來同時消費(fèi)這個消息中間件里面的登錄消息,達(dá)到橫向擴(kuò)展的作用。 時間:2017年07月22日星期六說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)源碼:無學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:課程介紹 1-1 課程安排 Java...

    twohappy 評論0 收藏0
  • Tomcat 7 server.xml 配置文件詳解

    摘要:每個可以創(chuàng)建一個線程池,但是可以在以及其他組件之間共享,只要那些組件配置之后支持。線程池最大活躍線程數(shù)量,默認(rèn)。如果配置了組件防止泄露的監(jiān)聽器,它會通知停止環(huán)境。如果未指定此屬性,會使用一個私有的內(nèi)部來提供線程池。 概覽 Tomcat7作為Servlet/JSP容器,它的全部行為的配置指令,包含在/conf/server.xml文件中,這個文件是一個無預(yù)定義結(jié)構(gòu)的XML文件,所有的屬性...

    crossoverJie 評論0 收藏0
  • 優(yōu)雅地關(guān)閉kubernetes中的nginx

    摘要:被設(shè)計為這樣一種方式,父進(jìn)程必須明確地等待子進(jìn)程終止,以便收集它的退出狀態(tài)。會完成的刪除,將優(yōu)雅退出的時間設(shè)置為表示立即刪除。 SIGINT SIGTERM SIGKILL區(qū)別 三者都是結(jié)束/終止進(jìn)程運(yùn)行。 1.SIGINT SIGTERM區(qū)別 前者與字符ctrl+c關(guān)聯(lián),后者沒有任何控制字符關(guān)聯(lián)。前者只能結(jié)束前臺進(jìn)程,后者則不是。 2.SIGTERM SIGKILL的區(qū)別 前者可以被...

    Noodles 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<