我在web.xml中配置了几行参数,代码如下(servlet-mapping省略):  <servlet>
    <servlet-name>old</servlet-name>
    <servlet-class>com.xxx.servlet.Old</servlet-class>
<init-param>
<param-name>old</param-name>
<param-value>8888</param-value>
</init-param>
<load-on-startup>10</load-on-startup>
  </servlet>在servlet程序里是这样写的: public void init(ServletConfig config) throws ServletException {
super.init(config);
System.out.println(config.getInitParameter("old"));
try {
new startServer().startOldTCPServer();
} catch (IOException e) {
e.printStackTrace();
}
}这个“old”字符串8888是可以在控制台输出的,而且控制台只输出到“8888”。问题是处在“new startServer().startOldTCPServer();”这步就不向下进行了。因为里面是一个循环,代码如下: public void startOldTCPServer() throws IOException {
ServerSocket server = new ServerSocket(port);
oldServer = true;
while (true) {
// transfer location change Single User or Multi User
OldDao goldControlDao = new OldDao(server.accept());
goldControlDao.start();
}
}不向下进行,那么tomcat也就没有“Service startup in XXX ms”。没有这个也就无法访问我的网站。那么现在的需求是在tomcat启动时(或者启动后),自动调用startOldTCPServer()方法,而不是手工请求servlet来调用startOldTCPServer()方法。而且,我还有一段代码是startNewTCPServer(),里面同样是一个循环。
请问这种问题用什么可以解决?
我初步的解决方案是使用一个timer。再用个数组,数组里放的是我需要调用的方法名称。假设我现在有两个方法需要调用,那么我让timer循环两次,一次取出两个方法名称,通过反射机制调用OldDao类的startOldTCPServer方法,同理调用startNewTCPServer方法。不知这样是否可以。当timer循环到第三次时,直接cancel掉,这时候tomcat就应该向下执行了吧。当然,即使可行,我这个也是最笨的方法,请各位大虾帮忙,谢谢了!

解决方案 »

  1.   

    死循环了你的server会不停的启动,而不是只启动一次
      

  2.   

    说白了,就是servlet改成filter
    搜一下就有了
    首先要确定你方法没问题
      

  3.   


    方法没问题,过那个循环是为了同时接收多个socket请求而写的,网上也只有这个方法。主要问题就是那个循环。不知你是否明白我的话
      

  4.   

    开始我都是在tomcat启动后,通过页面,请求调用这个方法。同样的效果:点击后页面没有反应(因为进入了一个死循环),但是socket服务端程序已经启动,这时刷新页面即可,可以用socket客户端对服务端进行请求。
      

  5.   


       看了一下你的代码,应该是想在加载servlet的时候就启动socket监听,来完成socket通讯。   但是在init初始化的时候出现死循环,所以一直无法init成功。    感觉用过滤器好像也不行,建议使用线程处理,在init方法中调用一个线程,线程中去启动socket监听, 这样的话init应该会继续往下走,能够初始化成功!
      

  6.   


    嗯,确实是这个问题。用线程,我也想过,不过单用“.start()”还要卡在那个while里面。真是伤脑筋啊……
      

  7.   


        你可以先写好线程类,在init方法中调,start()方法调用以后,在run()方法中写while启动监听不就可以了么?start()以后,什么时候启动线程由CPU来决定,你的应用程序可以继续往下走,while在现场中run()方法中再用就可以啊   ----有分了,给点分,我穷人啊 :)