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>
您的#conncet() - 方法處於無限循環。因此#contextInitialized()方法永遠不會完成。通常一個tomcat有一個啓動超時。在這段時間內,啓動過程( - >上下文初始化)必須完成。 當您直接編程套接字時,您不需要像tomcat這樣的webcontainer。 webcontainer根據接收到的請求執行一個servlet。請求(例如,在您的瀏覽器中調用URL)和servlet之間的映射在web.xml中定義。這不是你現在正在做的事情。 – Christopher
謝謝。爲了解決本地問題,我知道我不需要任何容器或類似的東西,但最終我想將服務器移動到某個外部主機(例如OpenShift),因此最終我需要一些服務器,如tomcat或jBoss或其他東西。現在我想我會在單獨的線程上運行它。 –