我正在开发一个使用嵌入式 tomcat 服务器 7 的应用程序,并在嵌入式服务器上部署一个 Web 应用程序。
我的应用程序通过 Rest API 访问嵌入式 Web 应用,但我的客户端收到Connection Timed Out
异常,并且端口也未被阻止。当我在本地计算机上安装此应用程序时,我从未收到此异常。
一些观点:
- IP 地址用于主机名部分(它们可以通过其他端口访问此 IP 地址)
- 端口未被阻塞
- 我们正在使用 Apache HttpClient 库来访问 URL
- 超时间隔似乎不是一个问题。
导致此异常的可能原因是什么Connection Timed Out
?或者如何在本地机器上模拟此问题?
任何指点都会有帮助。
答案1
我只是假设您正在使用 Linux/Unix(包括 telnet 和 netstat)...并且您在端口 8080 上运行。(请编辑您的帖子并添加此信息;然后,如果我猜对了,请删除我的答案上的此通知)
检查 tomcat 是否按预期监听:
$ netstat -lant | grep 8080
(在 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
(在 Windows 上,我不确定除了 telnet 之外还可以尝试什么……您想要一些可以忽略重定向、会话、身份验证等的东西,只给您一个简单答案的东西;也许使用 cygwin 和“curl -v”命令)(要退出 telnet,请按 ctrl+],然后输入“quit”并按回车键)
远程测试:
$ telnet <your ip here, not localhost or 127.0.0.1> 8080
如果本地测试和远程测试之间存在差异,请检查两者之间所有机器上的防火墙,包括服务器和客户端。(Linux 客户端通常不会阻止任何传出内容,但 Windows 7 可能会)
最后但同样重要的一点是,运行 tcpdump:
$ sudo tcpdump not port 22
(tcpdump 也适用于 Windows)
然后在另一个窗口中启动 tomcat 服务器,然后尝试连接客户端以查看会发生什么。(其他人更喜欢 wireshark 或其他工具;我可能是唯一一个使用原始低级工具的人)
然后在 tcpdump 的输出中查找端口号。尝试添加更多条件以排除您不关心的内容(例如,广播、netbios 等...服务器上正在运行的其他内容;我排除了 22 个,因此如果您通过 ssh 登录,您不会看到自己的 ssh 流量向您发送垃圾邮件)一些愚蠢的应用程序服务器(例如,旧的 Jboss 版本)会做出非常愚蠢的事情,做出可怕的假设,并尝试在未打开的端口上进行连接(对于 mxbeans 或它们的任何名称),甚至在它们开始监听之前,有时会因此而失败。