好的,我已经被困住了几天的问题是Tomcat没有运行我的应用程序。这是我第一次遇到Tomcat和服务器编程,所以它最有可能纯粹是我的错。但是在几天之内我无法自己打败它,所以我决定在这里发一个问题。
我尝试过运行很多不同的设置,但现在我处于最简单的状态,但仍无法解决。所以,我已经安装了:Eclipse IDE 1.5.0(Eclipse平台4.2.0),WST 3.4.1,通过Eclipse安装的Tomcat 7.0.12(也试过7.0.30)。
我已经在eclipse中配置了tomcat服务器,所以当我运行它时 - 它确实按预期工作。
但是我已经从服务器套接字上的oracle指南获得了这段简单的代码:
import java.net.*;
import java.io.*;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Logger;
public class KnockKnockServer {
private static final Logger logger = Logger.getRootLogger();
public static void main(String[] args) throws IOException {
BasicConfigurator.configure();
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(4444);
logger.debug("Socket opened");
System.err.println("Port opened");
} catch (IOException e) {
logger.debug("Could not listen on port: 4444.");
System.err.println("Port not opened");
System.exit(1);
}
Socket clientSocket = null;
try {
clientSocket = serverSocket.accept();
logger.info("socket accepted");
} catch (IOException e) {
logger.info("Accept failed.");
System.exit(1);
}
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocket.getInputStream()));
String inputLine, outputLine;
KnockKnockProtocol kkp = new KnockKnockProtocol();
outputLine = kkp.processInput(null);
out.println(outputLine);
while ((inputLine = in.readLine()) != null) {
outputLine = kkp.processInput(inputLine);
out.println(outputLine);
if (outputLine.equals("Bye."))
break;
}
out.close();
in.close();
clientSocket.close();
serverSocket.close();
}
}
当我执行“运行方式 - >在服务器上运行”启动时不起作用。我尝试将它添加到WAR和部署,但它产生相同的结果 - 没有。这意味着我可以使用另一个客户端应用程序(来自另一个eclipse实例)连接到它,也不会产生任何显示它可用的消息(只访问tomcat生成的日志)。正如您所看到的,我将log4j添加到代码中以查看任何证明代码在服务器上实际运行RUNS的消息(最初只有System.err和System.out),我尝试为控制台输出和文件输出配置。
再次,服务器本身按预期运行 - 我可以通过浏览器,打开管理器应用程序,部署/取消部署应用程序等访问它。
所以问题是:我做错了什么?我假设可能有一些原始的错误/撤消步骤/我做了什么,但我无法在谷歌的帮助下在2天的战斗中弄明白。
非常感谢帮助。
更新:非常感谢!我怀疑 - 愚蠢的我:)不知道为什么我开始与Tomcat混乱,但是,运行应用程序工作正常。那些即时答案为我节省了很多时间。非常感谢。
答案 0 :(得分:3)
我认为这里存在误解。 Tomcat是一个servlet容器 - 它旨在运行由servlets组成的Web应用程序。
你的KnockKnockServer
是一个普通的Java应用程序,因此在“Tomcat”上运行它绝对没有意义。您应该将其作为独立应用程序运行。
实际上,有时为在Tomcat上运行的Web应用程序内的某些特定协议启动服务器是有意义的。在这种情况下,您需要从ServletContextListener
控制自定义服务器的生命周期。但我不认为这是你的情况。
答案 1 :(得分:1)
尝试将其作为Java应用程序运行。不是作为Web应用程序。它似乎不是一个Java Web应用程序
答案 2 :(得分:0)
您尝试使用主类打开套接字。您不应该在服务器上运行您的应用程序,您的应用程序将是服务器本身。点击运行方式>作为应用程序运行。
答案 3 :(得分:0)
Tomcat是一个servlet容器。意味着运行Web应用程序。您正试图在容器中运行java类,这是不可能的。尝试将其作为独立应用程序运行。