JavaWeb服务启动时,在后台启动加载一个线程进行Socket监听端口

最近,做一个项目,需要做一个web服务器,该服务器要与Android端和GPRS模块互相通信。考虑Android端与服务器端用Http通信,GPRS模块与服务器用Tcp通信。因此需要在Web服务器启动的时候启动加载一个线程负责Tcp端口的监听。

search了一些方法,从中挑选了两个在此记录一下:

方法一:监听(Listener)

我们创建一个监听类,继承自ServletContextListener,代码如下:

 1 package will;
 2
 3
 4 import java.io.IOException;
 5
 6 import javax.servlet.ServletContextEvent;
 7 import javax.servlet.ServletContextListener;
 8
 9 public class SocketListener implements ServletContextListener {
10
11     private MyThread myThread;
12     @Override
13     public void contextDestroyed(ServletContextEvent arg0) {
14         if (myThread!=null&&myThread.isInterrupted()) {
15             myThread.interrupt();
16         }
17
18     }
19
20     @Override
21     public void contextInitialized(ServletContextEvent arg0) {
22         String str =null;
23         if (str==null&&myThread==null) {
24             myThread=new MyThread();
25             myThread.start();//servlet上下文初始化时启动socket
26         }
27     }
28
29
30     /*
31      * 自定义一个Class线程类继承自线程类,重写run()方法,用于从后台获取处理数据
32      *
33      */
34     class MyThread extends Thread{
35         public void run() {
36             while (!this.isInterrupted()) {//线程未中断执行循环
37                 try {
38                     Thread.sleep(2000);//每隔2000ms执行一次
39
40
41                 } catch (InterruptedException e) {
42                     e.printStackTrace();
43                 }
44
45                 //----------------------开始执行---------------------
46                 System.out.println("TIME:"+System.currentTimeMillis());
47
48                 Server ss=new Server();
49                 try {
50                     ss.startWork();
51                 } catch (IOException e) {
52                     // TODO Auto-generated catch block
53                     e.printStackTrace();
54                 }
55             }
56         }
57     }
58
59 }

需要在web.xml中添加配置如下:

1 <listener>
2   <listener-class>will.SocketListener</listener-class>
3 </listener>

方法二:使用Servlet,在项目启动时启动它。

我们创建一个Servlet,继承HttpServlet,代码如下:

 1  package will;
 2 import java.io.IOException;
 3 import javax.servlet.ServletException;
 4 import javax.servlet.http.HttpServlet;
 5 import javax.servlet.http.HttpServletRequest;
 6 import javax.servlet.http.HttpServletResponse;
 7 import com.ite.common.Constants;
 8
 9 public class MyServlet extends HttpServlet{
10
11     private static final long serialVersionUID = 1L;
12     private MyThread1 myThread1;
13
14     public MyServlet(){
15     }
16
17     public void init(){
18         String str = null;
19         if (str == null && myThread1 == null) {
20             myThread1 = new MyThread1();
21             myThread1.start(); // servlet 上下文初始化时启动 socket
22         }
23     }
24
25     public void doGet(HttpServletRequest httpservletrequest, HttpServletResponse httpservletresponse)
26         throws ServletException, IOException{
27     }
28
29     public void destory(){
30         if (myThread1 != null && myThread1.isInterrupted()) {
31             myThread1.interrupt();
32         }
33     }
34 }
35
36 /**
37  * 自定义一个 Class 线程类继承自线程类,重写 run() 方法,用于从后台获取并处理数据
38  *
39  * @author will
40  *
41  */
42 class MyThread1 extends Thread {
43     public void run() {
44         while (!this.isInterrupted()) {// 线程未中断执行循环
45             try {
46                 Thread.sleep(2000);
47             } catch (InterruptedException e) {
48                 e.printStackTrace();
49             }
50
51             // ------------------ 开始执行 ---------------------------
52             System.out.println("TIME:" + System.currentTimeMillis());
53         }
54     }
55 }  

在web.xml中的相应配置为:

1 <servlet>
2     <servlet-name>MyListener</servlet-name>
3     <servlet-class>will.MyServlet</servlet-class>
4     <load-on-startup>9</load-on-startup><!-- 数字越小,启动的优先级越高,必须大于0 -->
5 </servlet>
6 <servlet-mapping>
7         <servlet-name>MyListener</servlet-name>
8         <url-pattern>/test</url-pattern>
9 </servlet-mapping>  

Socket端口的监听方法在这里就不写了,大家直接在“-----------开始执行----------”后添加调用就可以了

其中,Listener的方式,该线程肯定是项目中首先启动的,优先于任何一个Servlet。而Servlet的方式,可以设置与其它Servlet启动的顺序。如果有时候需要首先启动一个Servlet或者它们之间的启动顺序有特殊要求的时候,这个就很有作用了。

时间: 2024-08-09 11:00:45

JavaWeb服务启动时,在后台启动加载一个线程进行Socket监听端口的相关文章

JavaWeb 服务启动时,在后台老板启动加载一个线程

avaWeb 服务启动时,在后台启动加载一个线程JavaWeb 服务启动时,在后台启动加载一个线程. 目前,我所掌握的一共有两种方法,第一种是监听(Listener),第二种是配置随项目启动而启动的Servlet. 下面对这两种方法做一简单的介绍,(Mark一下,防止以后急用又忘记了): 监听(Listener) 首先,我们创建一个监听的类,继承ServletContextListener,如下: 源码复制打印    package com.wxp.thread;    import javax

android项目 之 来电管家(7) ----- 加载用户设置并启监听用服务

因为我们用的是SharedPreferences来存储用户设置信息,那么在初次进入来电管家时,会有一些默认的设置,后续根据用户的设置,更新设置信息文件的内容. 打开应用程序,首先启动的是ActivityGroupDemo,并默认显示黑名单界面,这时,需要在ActivityGroupDemo.java中添加代码,判断用户是否是第一次进入该应用,如果是第一次,则写入默认的设置信息. 这里判断用户是否为第一次进入该应用程序,采用的思路为: 1)因为SharedPreferences会在应用程序目录下的

Tomcat服务器无法启动socket监听端口

最近生成一个新的web服务器,在启动后无法启动socket监听,检查程序本身无问题, 找原因,只是发布时搞错.处理如下: 1.在Eclipse平台 删除原来的web server; 2.新建server 3.删除tomcat服务器conf目录 下所有文件,server下的config文件到该目录: 4.删除tomcat服务器webapps 下项目.war 及对应目录,拷新 项目.war.

STS启动时卡在loading加载 dashboard.ui

如果你在用STS 3.4或3.5,启动时可能会卡在 解决方法:打开STS安装目录下的plugins目录,删除文件 org.springsource.ide.eclipse.dashboard.ui_3.4.0.201310051510-RELEASE.jar

Fragment中加载网页(WebView)监听Back键 ,实现返回上一页的功能

首先创建一个抽象类BackHandledFragment,该类有一个抽象方法onBackPressed(),所有BackHandledFragment的子类在onBackPressed方法中处理各自对Back事件的消费逻辑.onBackPressed返回布尔值,宿主Activity将会根据该方法的返回值判断子Fragment是否有消费Back事件.此外,宿主FragmentActivity还会保持一份当前Fragment的引用,当用户按下Back键时,宿主Activity会判断当前Fragmen

ListView异步加载 LruCache缓存 滑动状态监听

Android异步加载的总结.除了LruCache,我们还可以使用DiskLruCache这个第三方的类来实现"二级缓存".异步加载不仅仅是获取网络资源,我们可以加所有耗时的操作都看成异步加载,所有通过耗时的操作获取的结果我们都可以通过缓存来提高效率,比如我们可以利用这里的LruCache和DiskLruCache(这个缓存一般是用于缓存从网络获取的图片,视频等大的资源,这个时候我们一般和LruCache结合使用),使用Cache有个缺点,就是我们不能保证我们的数据是实时的,所以在re

Web应用启动时,后台自动启动一个线程(转)

原文:http://blog.sina.com.cn/s/blog_6810dfc20101ipzq.html Web应用启动时,后台自动启动一个线程 (1)前言 前几天,manager问道一个问题:能不能实现类似于cron的后台管理方式.问题解决后,想对这几个问题进行一下简单的总结.以便抛砖引玉!首先简单的提及一下cron. Cron,计划任务,是任务在约定的时间执行已经计划好的工作,这是表面的意思.在Linux中,我们经常用到 cron 服务器来完成这项工作.cron服务器可以根据配置文件约

tomcat启动时自动加载一个类&#160;MyServletContextListener

目的: 我们知道在tomcat启动后,需要页面请求进行驱动来执行操作接而响应.我们希望在tomcat启动的时候能够自动运行一个后台线程,以处理我们需要的一些操作.因此需要tomcat启动时就自动加载一个类,或运行一个类的方法. 可以采用ServletContextListener. 方法: (1)编写一个监听类,实现javax.servlet.ServletContextListener接口. 1 import javax.servlet.ServletContextEvent; 2 impor

如何在tomcat启动时加载一个类

Tomcat启动时classloader加载顺序 Tomcat的class加载的优先顺序一览   1.最先是$JAVA_HOME/jre/lib/ext/下的jar文件.   2.环境变量CLASSPATH中的jar和class文件.   3.$CATALINA_HOME/common/classes下的class文件.   4.$CATALINA_HOME/commons/endorsed下的jar文件.   5.$CATALINA_HOME/commons/i18n下的jar文件.   6.