2015-04-07 83 views
2

首先 - 我對servlet和所有其他Java EE的東西都沒有多少經驗。Tomcat超時工作

我想做簡單的聊天室,但在所有之前,我只是試圖做出簡單的udp服務器和客戶端。一切正常,除了一件事情,即超過45秒的tomcat超時並關閉。我只有一個調用UDP服務器類的contextListener。

是不是因爲我沒有servlet或..

這裏是我的UDP服務器類:

public UDPServer() { 
    System.out.println("Constructor reached"); 
    try { 
     connect(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 


public void connect() throws Exception 
{ 
    int serverPort = 9123; 
    System.out.println("Server is starting"); 
    DatagramSocket serverSocket = new DatagramSocket(serverPort); 
    System.out.println("Server started"); 
     byte[] receiveData = new byte[1024]; 
     byte[] sendData = new byte[1024]; 
     while(true) 
      { 
      DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
      serverSocket.receive(receivePacket); 
      String sentence = new String(receivePacket.getData()); 
      System.out.println("RECEIVED: " + sentence); 
      InetAddress IPAddress = receivePacket.getAddress(); 
      int port = receivePacket.getPort(); 
      String capitalizedSentence = sentence.toUpperCase(); 
      sendData = capitalizedSentence.getBytes(); 
      DatagramPacket sendPacket = 
      new DatagramPacket(sendData, sendData.length, IPAddress, port); 
      serverSocket.send(sendPacket); 
      receiveData = new byte[1024]; 
      sendData = new byte[1024]; 
      } 
} 

這裏是我的簡單contextListener

public class StartupServlet implements ServletContextListener { 

// private static Logger logger = Logger.getAnonymousLogger(ApplicationListener.class); 

    @Override 
    public void contextDestroyed(ServletContextEvent servletContextEvent) { 
     // logger.info("class : context destroyed"); 

    } 

    @Override 
    public void contextInitialized(ServletContextEvent servletContextEvent) { 
     ServletContext context = servletContextEvent.getServletContext(); 
     ///// HERE You launch your class 
     UDPServer udpserver = new UDPServer(); 
     // logger.info("myapp : context Initialized"); 
    } 

}

而且這裏是web.xml

<web-app> 
<listener> 
    <listener-class>com.chatroom.servlet.StartupServlet</listener-class> 
</listener> 
</web-app> 
+0

您的#conncet() - 方法處於無限循環。因此#contextInitialized()方法永遠不會完成。通常一個tomcat有一個啓動超時。在這段時間內,啓動過程( - >上下文初始化)必須完成。 當您直接編程套接字時,您不需要像tomcat這樣的webcontainer。 webcontainer根據接收到的請求執行一個servlet。請求(例如,在您的瀏覽器中調用URL)和servlet之間的映射在web.xml中定義。這不是你現在正在做的事情。 – Christopher

+0

謝謝。爲了解決本地問題,我知道我不需要任何容器或類似的東西,但最終我想將服務器移動到某個外部主機(例如OpenShift),因此最終我需要一些服務器,如tomcat或jBoss或其他東西。現在我想我會在單獨的線程上運行它。 –

回答

2

UDP服務器運行在與servlet初始化程序線程相同的線程中,並且它具有無限循環。所以,應用程序無法啓動。在單獨的線程中運行UDPServer。