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

首頁 > 學院 > 開發設計 > 正文

如何使用Java編寫NT服務(二)

2019-11-18 14:48:04
字體:
來源:轉載
供稿:網友
四、為什么要采用java編寫NT服務 
比較VC等“原裝”NT服務開發方式而言,Java開發模式可以更快捷,因為幾乎所有得服務框架通過擴展Services類就可以達到,省下不少復雜的細節處理。Java語言提供了豐富的類庫,可以為自己使用,可以提高效率,而且編寫的程序結構清楚輕易理解,方便以后維護。 

Java提供的異常處理模式,可以讓我們寫好結構良好,更加安全的代碼。試想假如編寫的服務進程由于采用VC編寫卻忘記對某塊內存的釋放,那么服務啟動后一段時間由于內存泄漏造成服務性能下降,甚至系統崩潰;但是Java本身的語言特性可以使我們不用時刻提防內存治理,可以更加關注服務邏輯本身,是的實現起來更加有效率。 

采用VC假如編寫多線程服務進程,雖然可以實現,但是會相當麻煩。而服務進程多線程幾乎是每一個性能良好的服務必備特征,Java語言本身可以提供這方面良好的支持,同時Java自身對網絡的天然良好支持,使各種網絡套接字編程輕易。 

最后,假如不采用其他擴展庫,我們很輕易將此服務邏輯實現在其他操作系統上。一個編寫好的NT服務程序,可以在去掉對Ms的相關本地化擴展實現的類引用后,方便移植到其他例如linux等平臺上,盡可能向Java的“一次編寫、到處可運行”的理想境界靠攏。 

五、源碼 
/*所附的Zip文件報含示例的全部工程文件,還有編譯后的NT服務的可執行文件,您可以直接測試此服務exe文件的安裝、服務啟停*/ 



/*EchoSvc.java*/
import com.ms.service.* ;
public class EchoSvc extends Service 
{
       static Thread mainSvc=null ; //定義主線程
  public  EchoSvc (String[] args) //構造服務
       {
                CheckPoint(1000);    //服務是系統的一部分,作為Log紀錄,可以幫助用戶理解系統故障
                     setRunning(ACCEPT_SHUTDOWN  ACCEPT_PAUSE_CONTINUE ACCEPT_STOP);
                     mainSvc = new Thread((Runnable) new  MainSvcThread());
            mainSvc.start();     
                     System.out.PRintln( "The Echo Service Was Started SUCcessfully!");
       }
}
/*-------------- EchoSvc.java源碼結束-------------------*/

/*MainSvcThread.java*/
import java.io.*;
import java.net.*;
public class MainSvcThread implements Runnable //實現線程控制多線程接口
{     /將啟動一組線程來監聽多個服務請求
         public static boolean STOP = false;  //由系統來控制的內部變量,決定著服務進程(線程)的啟動、暫停等
      public static boolean PAUSE = false; 
         public int ListenThreadCount=0;  //本服務支持的當前線程數量
         int maxSocket=10;  //最大支持的同時連結數
         int SvcPort=2002;  //服務監聽的端口       

         public void run()
         {
        try
               {
           while (!STOP)
                 {  
                        while (!PAUSE && !STOP) 
                        {
                               {//創建監聽服務器
                             Socket server;  
                             ServerSocket  li=new ServerSocket(SvcPort);  //創建服務器端套接字
                             ThreadGroup g=new ThreadGroup("EchoThreads"); //創建一組線程
                    System.out.println("Echo service starting...");  //記錄在Log中
                             while(ListenThreadCount<maxSocket)
                                      {
                                            server=li.accept();  //監聽
                                             EchoThread p=new EchoThread(server,this); //創建服務單線程
                                             Thread t=new Thread(g,(Runnable)p) ; //創建新線程
                                             t.start(); //啟動服務線程
                                             ListenThreadCount++; //當前線程的數量
                                      }
                      }
                   try 
                   {
                     Thread.sleep(5000);//暫停5秒
                    } 
                    catch (InterruptedException e) 
{   }
              }
               try 
                         {
                           Thread.sleep(1000);
                         }
                        catch (InterruptedException ie) 
                       {  }
          }
              }
              catch (IOException ioe)
              {} 
         }  //Run結束  
}
/*-------------- MainSvcThread.java源碼結束-------------------*/


/*EchoThread.java*/
import java.io.*;
import java.net.*;
/*實現每一個客戶連接到此NT服務時的服務器端的線程單元邏輯*/
public class EchoThread implements Runnable   //實現線程接口
{
    Socket so=null;//套接字
       MainSvcThread p;  //一個指向父線程的指針,EchoThread的線程是服務線程的創建的子線程
       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!");  //發送問候
               out.flush();   //必須刷新緩沖區內的內容

               while((line=in.readLine())!=null && ! exitflag)
                {
                     line=line.trim();
                      if (line.equalsIgnoreCase("quit") )
                      {//假如是退出命令,則關閉當前套接字上的輸入輸出流
                            in.close();
                out.flush();
                            out.close();
p.ListenThreadCount --; //主線程的服務線程單元數量控制
                            return;   //退出當前的服務邏輯線程單元
                      }
                      else
                      {
                      out.println("ECHO:" + line );
                      out.flush(); 
                      }
                 }
          in.close();
                out.close();
                p.ListenThreadCount --;
              }
              catch(IOException ioe)
              {}
       }
       
  EchoThread(Socket s,MainSvcThread parent)
       {
              so=s;
              p= parent;
       }
}
/*-------------- EchoThread.java源碼結束-------------------*/


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 建平县| 鄱阳县| 广河县| 湘阴县| 宜兰市| 邓州市| 崇礼县| 奇台县| 丹江口市| 满洲里市| 锡林郭勒盟| 汶川县| 重庆市| 固镇县| 白朗县| 鄂托克旗| 资溪县| 霍邱县| 苍山县| 开封市| 陈巴尔虎旗| 南汇区| 封开县| 茶陵县| 清苑县| 甘孜县| 襄垣县| 红安县| 财经| 金门县| 佛学| 广汉市| 红桥区| 满洲里市| 政和县| 金秀| 湘潭县| 太和县| 长顺县| 林西县| 屏南县|