连接超时异常,为什么?

Dhe*_*wal 0 tomcat java

我正在开发一个使用嵌入式 tomcat 服务器 7 的应用程序,并在嵌入式服务器上部署一个 Web 应用程序。

我的应用程序通过 Rest API 访问嵌入式 Web 应用程序,但我的客户端出现Connection Timed Out异常,并且端口也没有被阻止。当我在本地计算机上安装此应用程序时,我从未遇到此异常。

几点:

  • IP地址用于主机名部分(他们可以在其他端口访问该IP地址)
  • 端口未被封锁
  • 我们使用 Apache HttpClient 库来访问 URL
  • 超时间隔似乎不是问题。

出现此异常的可能原因有哪些Connection Timed Out?或者如何在本地计算机上模拟此问题?

任何指示都会有帮助。

Pet*_*ter 5

我只是假设您正在使用 Linux/Unix(包括 telnet 和 netstat)...并且您在端口 8080 上运行。(请编辑您的帖子,并添加此信息;然后如果我猜对了,请删除此信息注意我的回答)

检查 tomcat 是否按预期监听:

$ netstat -lant | grep 8080
Run Code Online (Sandbox Code Playgroud)

(在Windows上,可以尝试在任务管理器中找到资源监视器)

如果您看到 0.0.0.0:8080,那么您正在监听所有接口。如果你根本看不到该端口和“LISTENING”,那么你的 tomcat 就没有在监听。

如果这不起作用,请检查服务器日志(例如 tomcathome/logs/catalina.out)或 tomcathome/conf/server.xml 以查看端口是否不同。我发现 catalina.out 有答案(例如,也许您以非 root 用户和端口 80 运行它,Linux/Unix 中不允许 <1024)

在本地测试一下。

$ telnet localhost 8080
$ telnet <your ip here, not localhost or 127.0.0.1> 8080
Run Code Online (Sandbox Code Playgroud)

(在 Windows 上,我不知道该尝试什么来代替 telnet...你想要一些能够忽略重定向、会话、身份验证等的东西,并且只给你一个原始的简单答案;也许使用 cygwin 和“curl -v " 命令)(要退出 telnet,请按 ctrl+],然后输入“quit”并按 Enter)

远程测试一下:

$ telnet <your ip here, not localhost or 127.0.0.1> 8080
Run Code Online (Sandbox Code Playgroud)

如果本地测试和远程测试之间存在差异,请检查所有机器上的防火墙,包括服务器和客户端。(Linux 客户端通常不会阻止任何传出内容,但 Windows 7 可能会)

最后但并非最不重要的一点是,运行 tcpdump:

$ sudo tcpdump not port 22
Run Code Online (Sandbox Code Playgroud)

(tcpdump也适用于Windows)

然后在另一个窗口中,启动 tomcat 服务器,然后尝试与客户端连接,看看会发生什么。(其他人更喜欢wireshark或其他工具;我可能是唯一一个使用原始低级工具的人)

并在 tcpdump 的输出中查找端口号。尝试添加更多条件来排除您不关心的内容(例如广播、netbios 等...服务器上正在运行的其他内容;我排除了 22,因此如果您通过 ssh 登录,您将看不到自己的 ssh流量垃圾邮件)一些愚蠢的应用程序服务器(例如旧的 Jboss 版本)会做非常愚蠢的事情,做出可怕的假设,并在开始监听之前尝试连接未打开的端口(对于 mxbeans 或任何它们的名称),有时会因此而失败。