国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

如何使用Java編寫NT服務(wù)(一)

2019-11-18 14:48:04
字體:
供稿:網(wǎng)友
一、NT服務(wù)介紹
所謂NT服務(wù),實際上是一類非凡的應(yīng)用程序,實際上就是一個可以在系統(tǒng)啟動時自動在一定身份下啟動的伴隨系統(tǒng)長時間存在的進程。象FTP server、HTTP server、脫機打印等都是采用NT服務(wù)的形式提供的。這實際上類似Unix的root daemon進程。NT服務(wù)歸納起來,NT服務(wù)又以下幾個特征: 

1、可以自啟動,不需要交互啟動。這對于服務(wù)器來說是一個重要的特征。當(dāng)然,你可以決定服務(wù)是否自啟動,甚至可以屏蔽某個服務(wù)。
2、NT服務(wù)沒有用戶界面,基本上類似一個DOS 程序,因為NT服務(wù)必須長時間運行,所以不想普通win32進程一樣有自己的界面。但是NT服務(wù)可以同用戶有界面交互,這是一類非凡的服務(wù)進程。可以通過NT的任務(wù)治理器來看到服務(wù)進程。
3、NT服務(wù)通過SCM(Services Control Manager)接口來治理,安裝、啟動、停止、撤除等都需要SCM的接口功能來進行。控制面板的服務(wù)控制器就是利用SCM接口來治理系統(tǒng)中的所有服務(wù)的。實際上,還有一些可以控制服務(wù)的程序或者命令,有net.exe 、服務(wù)器治理器等 、SCM.exe等。
4、這些進程都以一定的身份運行,以方便進行服務(wù)器資源的存取。一般情況下使用域中的LocalSystem賬號運行,此賬號對本機上的大多數(shù)資源(除非非凡禁止)有完全的存取權(quán)限,這樣可以保證服務(wù)程序的“強大”。但是,也有些服務(wù)采用非凡的賬號運行,你也可以非凡設(shè)定一個服務(wù)的帳號。
5、由系統(tǒng)自動以線程方式運行,一般情況下不過多占用系統(tǒng)資源,這同普通的進程有所區(qū)別,假如不采用線程方式,一般進程往往消耗整個CPU資源。一般需要時時存在,又不能過多消耗資源的任務(wù)以服務(wù)來實現(xiàn)最合適。 

二、java編寫服務(wù)的預(yù)備 
1、作為本地化的實現(xiàn),實現(xiàn)NT服務(wù)的Java程序當(dāng)然不是100%純Java,單靠標(biāo)準(zhǔn)類庫是無法實現(xiàn)我們的編寫NT服務(wù)的目的,所以MS提供了一套SDK for Java(本文采用的是Microsoft SDK for Java 4.0),提到了如何利用MS提供的擴展類庫和相應(yīng)的工具,實現(xiàn)符合Windows平臺需要的程序。其中包括了實現(xiàn)NT服務(wù)的所需要的類庫API框架以及將Java編譯的class文件組裝成標(biāo)準(zhǔn)的NT服務(wù)程序的工具。SDK的下載路徑可以從www.microsoft.com/java/查找到。
2、安裝完SDK后可以看到在安裝目錄下有jntsvc目錄,此目錄就包含了service.zip文件,它實際上是一個NT services的類庫框架,封裝了一些NT服務(wù)實現(xiàn)細節(jié),使得我們可以按照框架舒適實現(xiàn)我們關(guān)心的細節(jié)。將service.zip展開至開發(fā)機器的系統(tǒng)安裝Service庫到Java擴展庫/Winnt/java/TrustLib下,假如在其他操作系統(tǒng)下進行開發(fā),參照此系統(tǒng)目錄進行安裝文件。
3、在該目錄下還有一個jntsvc.exe文件,也就是Java NT Service的意思啦。她可以幫助您實現(xiàn)將按照SDK提供的框架實現(xiàn)的編譯后的class文件組裝成一個標(biāo)準(zhǔn)的NT服務(wù)可執(zhí)行文件。JntSvc幫助我們在已經(jīng)編譯好的.class文件基礎(chǔ)上設(shè)置了所有NT服務(wù)程序必須的特征,是很重要的工具,得到NT服務(wù)取決于如何有效利用她。為了我們能夠方便從任何其他目錄的控制臺窗口調(diào)用她,我們將JntSvc.exe所在的目錄全路徑加入path環(huán)境變量。這可以通過設(shè)置系統(tǒng)屬性的高級屬性頁當(dāng)中進行環(huán)境變量的設(shè)定。
4、按照要求,我們寫好各項代碼,然后編譯編寫Java程序,得到class文件。我們當(dāng)然不會在Vj Studio中啟動她,因為它目前還沒有可執(zhí)行文件的入口,系統(tǒng)無法啟動她。為了得到NT服務(wù)程序,我們需要在class文件所在目錄的控制臺窗口執(zhí)行一個命令:X:>jntsvc *.class /OUT:ECHOSvc.exe /SVCMAIN:EchoSvc "/SERVICENAME:ECHOSvc"。具體的Jntsvc的參數(shù)我們可以看一看jntsvc -?得到,這里的意思大概是:將當(dāng)前目錄下的所有class文件組裝成一個NT服務(wù)進程exe文件,文件名為EchoSvc.exe,服務(wù)的啟動入口在echosvc.class中,在注冊表中相應(yīng)的服務(wù)名稱為/Servicename參數(shù)指定的EchoSvc。假如有多個多個NT服務(wù)需要組裝在一個Exe文件中,還可以在 /Out參數(shù)后指定每一個服務(wù)展示名稱。/SVCMAIN參數(shù)指定服務(wù)的入口,所謂入口是指服務(wù)啟動之初是從哪一個類的實例開始的。"/SERVICENAME:"參數(shù)指定了該服務(wù)將以什么名稱出現(xiàn)。這些參數(shù)都是jntsvc.exe實用工具需要組裝服務(wù)所必須的信息,根據(jù)這些信息將編譯后的.class文件按照win32格式要求得到一個可執(zhí)行文件。 

需要注重的是,這個exe文件的運行必須要有JVM存在,她實際上是通過解釋.class來實現(xiàn)服務(wù)提供的。假如需要另外的擴展包,可以通過在/Classpath參數(shù)指定另外的擴展包的位置。所以在安裝Java編寫得到的NT服務(wù)的機器上必須存在JVM。假如是擁有IE5.x那么不用操心這個問題,IE核心組件已經(jīng)包括了JVM;但是假如是IE6版本,則需要到MS的網(wǎng)站上下載JVM。假如您講SDK for Java安裝在服務(wù)器上就更方便了。
5、假如沒有什么錯誤,您將得到一個可執(zhí)行文件echosvc.exe。像大多數(shù)服務(wù)可執(zhí)行文件一樣,它可以將自己安裝到系統(tǒng)中: echosvc.exe ?install,這一個過程將會往系統(tǒng)注冊表添加一些項目,非凡是關(guān)于服務(wù)的項目,SCM也可以列出這個服務(wù)了。我們可以在控制臺下采用DOS NT服務(wù)控制命令Net start/stop來測試服務(wù)是否真像普通服務(wù)一樣可以按照標(biāo)準(zhǔn)方式來控制,當(dāng)然在服務(wù)治理器當(dāng)中啟停該服務(wù)更不會有問題。 

三、Echo服務(wù)的樣例
當(dāng)系統(tǒng)載入服務(wù)進程時,入口是在EchoSvc的構(gòu)造函數(shù)中,我們可以看到此構(gòu)造函數(shù)帶有同一般程序的入口main()類似的參數(shù)。 


import com.ms.service.* ;
 public class EchoSvc extends Service 

{     static Thread mainSvc=null ; //定義服務(wù)主線程
       public  EchoSvc (String[] args) //構(gòu)造此服務(wù)
       {
         CheckPoint(1000);    
              setRunning(ACCEPT_SHUTDOWN  ACCEPT_PAUSE_CONTINUE ACCEPT_STOP);
 // 該項服務(wù)接受的關(guān)于服務(wù)控制的命令
              mainSvc = new Thread((Runnable) new  MainSvcThread());
        mainSvc.start();     
       System.out.PRintln( "The Echo Service Was Started SUCcessfully!");
//紀(jì)錄事件,可以通過事件察看器看到
       }
}



CheckPoint是 Service的同步方法,指示系統(tǒng)正改變服務(wù)的狀態(tài),需要讓系統(tǒng)等待1秒。這里我們啟動的是一個線程,實際上相當(dāng)于一個進程,她是服務(wù)進程的主線程。在這個線程中我們響應(yīng)SCM對此服務(wù)的控制。大致的表達為:



public class MainSvcThread implements Runnable //實現(xiàn)線程控制
{     
public static boolean STOP = false;  
//由系統(tǒng)來控制的內(nèi)部變量,決定著服務(wù)進程(線程)的啟動、暫停等
      public static boolean PAUSE = false; 
         public void run()
         {
        while (!STOP)
                 {  
                       while (!PAUSE && !STOP) 
                        {
                              。。。//此處為服務(wù)控制邏輯,下面會充實此處
                      }
                try 
                {Thread.sleep(5000);//休眠5秒后實現(xiàn)暫停或者停止} 
                catch (InterruptedException e) 
{ }
              }
            try 
                     {Thread.sleep(1000);}
                     catch (InterruptedException ie) 
                     {}
         }
         }  //Run結(jié)束  
}



在服務(wù)邏輯控制當(dāng)中,我們會具體實現(xiàn)Echo服務(wù)。我們的Echo服務(wù)監(jiān)聽2002端口,接收客戶端任何一行輸入,然后加上“Echo:”后返回。假如客戶端輸入一個quit詞組那么服務(wù)認為這是客戶關(guān)閉此套接字的命令,會自動關(guān)閉當(dāng)前的套接字連接,停止對當(dāng)前連接的服務(wù)。具體的實現(xiàn)(EchoThread.java的代碼):



public void run()
       {
        String line;
        DataInputStream in;
        PrintWriter out;
        boolean exitflag=false;
       try
       {
        in=new DataInputStream(so.getInputStream()) ;//獲取套接字的輸入流
        out=new PrintWriter(new DataOutputStream(so.getOutputStream())) ;
      out.println("You have connected to EchoSvc!");  //發(fā)送問候
        out.flush(); 
        while((line=in.readLine())!=null) //讀取
         {
               line=line.trim();
               if (line.equalsIgnoreCase("quit") )
               {
           out.println("ECHO:" + line );
                 out.flush();
return;
}
               else
               {
               out.println("ECHO:" + line );
               out.flush(); 
               }
         }
        in.close();
        out.close();
}
catch(IOException ioe)
              {}
}



Echo服務(wù)主要就是將客戶發(fā)送的字符回顯給客戶,并加上Echo:的前綴,以表明是從服務(wù)器返回的內(nèi)容。假如客戶輸入“quit”那么表示這是要求服務(wù)器停止服務(wù)的表現(xiàn)。 

如何調(diào)試NT服務(wù)進程工程。假如直接將此函數(shù)調(diào)用來提供客戶端的ECHO套接字服務(wù),邏輯上是沒有什么錯誤,但是就是無法支持多個用戶同時訪問。為了能夠提供多服務(wù),答應(yīng)同時又多個用戶連接此服務(wù)器(這種情況在很多網(wǎng)絡(luò)服務(wù)都不可少),我們可以將此邏輯在由MainSvcTread創(chuàng)建的線程中實現(xiàn),而且可以答應(yīng)多個用戶同時訪問此服務(wù)。具體的表達在MainSvcTread的run函數(shù)中實現(xiàn): 



while(ListenThreadCount<maxSocket) //假如當(dāng)前啟動的線程數(shù)在系統(tǒng)答應(yīng)的范圍內(nèi)
{
          server=li.accept(); //監(jiān)聽
          EchoThread p=new EchoThread(server,this);//創(chuàng)建實現(xiàn)該服務(wù)的具體邏輯對象,是一個支持線程的類
          Thread t=new Thread(g,(Runnable)p) ; //將當(dāng)前線程并入線成組
          t.start(); //啟動服務(wù)線程
          ListenThreadCount++; //修改當(dāng)前線程數(shù)量
       }



參照上面提到的工具Jntsvc.exe可以幫助你講編譯好的.class文件組裝成exe文件,運行此文并加上-install參數(shù)可以自動幫助您講些好的服務(wù)添加到注冊表中,可以通過服務(wù)治理器或者相當(dāng)?shù)膶嵱贸绦騺砣缤渌?wù)一樣來進行控制了。撤除服務(wù)采用-uninstall參數(shù)。 

本例程采用套接字、多線程實現(xiàn)技術(shù)來解釋實現(xiàn)Java編寫NT服務(wù),實際上類似這樣的很多網(wǎng)絡(luò)方面的服務(wù)都可以按照此規(guī)范實現(xiàn),譬如POP3服務(wù)、FTP服務(wù),甚至WWW服務(wù)等。我們也接觸過像Tomcat、Jrun等Java應(yīng)用服務(wù)器在NT平臺的啟動往往采用NT服務(wù)形式,那么通過此例你也可以嘗試編寫自己的Java服務(wù)應(yīng)用。 

最后,假如需要調(diào)試NT服務(wù)的邏輯,可以采用一個變通的辦法。我們在EchoSvc.java中添加一個Main靜態(tài)方法,然后產(chǎn)生一個EchoSvc的實例,這樣就是一個標(biāo)準(zhǔn)的VJ產(chǎn)生的Exe文件,利用Vj的調(diào)試功能我們可以排除隱藏的錯誤。一旦調(diào)通后,我們注釋掉main靜態(tài)方法,編譯后就可以得到一個調(diào)試好的NT服務(wù)。 

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 庆云县| 海门市| 平谷区| 措美县| 洛浦县| 额敏县| 宝坻区| 科技| 邳州市| 安泽县| 望谟县| 九台市| 塔城市| 翁牛特旗| 和田县| 云龙县| 平乡县| 肇州县| 朝阳区| 城口县| 雷州市| 武宁县| 方城县| 平泉县| 额敏县| 哈巴河县| 关岭| 临朐县| 康定县| 壶关县| 阿克陶县| 山西省| 文登市| 宁明县| 鸡东县| 玉屏| 辰溪县| 台安县| 阿克苏市| 金塔县| 绥宁县|