国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

劉德剛 / 1539人閱讀

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

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

服務端程序,模擬正在后臺運行的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();
        }
    }
}

控制臺輸出的內容為:

  

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

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64022.html

相關文章

  • Java必知必會之socket

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

    jackzou 評論0 收藏0
  • 慕課網_《Java消息中間件》學習總結

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

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

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

    crossoverJie 評論0 收藏0
  • 優雅地關閉kubernetes中的nginx

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

    Noodles 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<