今日更新
技术新闻
精彩专题
IBM软件技术专区
微软开发专区
技术文档中心
编程语言
网络通信
网络安全
LINUX/UNIX
软件工程与管理
数据库开发
WEB开发
企业应用与开发
移动开发
资源中心
原创专栏
开放系统世界
人才与培训
技术天地论坛
厂商列表
社区推荐

· 女性身体内部人体受孕..
· 十部顶级的变态与情色..
· 感情放纵让我毁了两个..
· 当我撞见姐姐和男友在..
· 卖淫少女惨遭泄愤民工..
· 偷拍街上的走光mm绝对..
· 百度打击google的广告
· 港娱乐圈与黑社会揭秘
赛迪网>>技术应用>>J2SE
关键字: Java JntSvc.exe NT服务 多线程 套接字编程
来  源: JavaResearch
如何使用Java编写NT服务(二)
作者:yippit转贴 发文时间:2004.07.05
接上一篇:如何使用Java编写NT服务(一)

四、为什么要采用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源码结束-------------------*/


(责任编辑:代君利)




赛迪网推出“IT博客”,花不到一分钟就完成注册
评论】 【推荐】 【 】 【打印】 【关闭

·Linux专区· ·黑客攻防·
· Linux下添加硬盘、分区、格式化任务详解
· FreeBSD服务器的安装与优化之优化篇
· 初学者入门:FreeBSD服务器的安装与优化
· 金企鹅杯两岸四地开源软件大赛圆满结束
· 如何提高Linux系统安全性的十大招数
· 构筑Linux防火墙之为个人用户设置防火墙
· 谁更安全?黑客眼中的防火墙与路由器
· 识破骗局 练就识别QQ活动真伪火眼金睛
· 应用安全大有可为:目的、挑战、总结
· 道高一尺魔高一丈:安全防御的动感魅力
· 警惕网络“内”院起火 积极谋求安内之路
· HHCTRL漏洞被黑客利用 疯狂传播木马
·中国信息化· ·成功案例·
· ERP普及化是饮鸩止渴 精细化才是应用之道
· 赛门铁克第八期《互联网安全威胁报告》解析
· 抢食“数字工商” 国产中间件杀出血路
· 从IBM等操作系统的发展看软件创新的启示
· 服务成就蓝色快车 品牌是怎样炼成的?
· 三大技术应用大会合为一体甲骨文上演三重奏
· 南阳教育城域网 拆掉学校间的“围墙”
· 金算盘助申意美步入信息化快车道
· 不为人知的索尼信息化 谁是幕后英雄?
· InforBus/Q在穗高速路联网收费系统中的应用
· J2EE构建最新金融理念和运作模式的网上银行
· 食品安全令人担心 信息化能否保驾护航
*姓  名: 更多资料 了解方案 认识厂商
*单位名称:
*联系电话:
*电子邮件:
    
◆ 相关文章   ◆ 站内热点推荐
· 如何使用Java编写NT服务(一)
· 网管员论坛
· 开发者之家
· WLAN无限未来
· 我是如何掉进C#的……
· 中国“人件”非正式调查

   
合作网站: IBM dW中国网站 LinuxAID 软件工程专家网 中国系统分析员 UMLChina MATRIX Mobile2008 JavaResearch 华储网 UML软件工程组织 中国JAVA手机网 JAVA中文站 金山在线 海量科技