![](/img/trans.png)
[英]How to create a Java server which listens to a port and accepts multiple clients
[英]Which Java thread listens to which port?
我有一个在 Linux 上的 OpenJDK 1.8.0 上运行的 Tomcat 9.0.60 服务器,其中netstat -ltpn|grep java
显示它侦听的端口数量超过了配置的端口:
tcp 0 0 0.0.0.0:37917 0.0.0.0:* LISTEN 50384/java
tcp 0 0 10.100.0.188:39780 0.0.0.0:* LISTEN 50384/java
tcp 0 0 10.100.0.188:41415 0.0.0.0:* LISTEN 50384/java
tcp 0 0 0.0.0.0:34476 0.0.0.0:* LISTEN 51139/java
(我从该列表中删除了所有配置的端口。)
所以我认为几个应用程序也打开了他们监听的“他们自己的”套接字。 我想找出每个端口,哪个 Java 线程正在侦听,这样我就可以进一步找出应用程序,也许它是否仍然需要,或者只是开发人员忘记的剩余一个。
到目前为止,我试图通过 JMX 连接来了解VisualVM的内容,但没有走得很远——可能是因为我的经验不够。
你能给我任何提示 - 或者可能是一个完整的解决方案 - 我如何找出端口到线程映射?
我不需要自动执行此操作,它更像是偶尔进行的文档和检查手动工作。
如果我要弄清楚 Java 线程在听什么,我会尝试以下方法:
在 Web 应用程序代码库中搜索使用ServerSocket
类的 Java 代码,然后返回到负责的应用程序代码。
使用jstack
(或类似工具)捕获所有 Java 线程堆栈的快照。 然后扫描它们以查找在调用accept
方法时被阻塞的线程。
使用带有-K
选项的lsof
来获取监听线程的线程 ID。 然后使用jstack
和如何通过已知的 PID/TID 获取 JVM 线程名称/id中描述的技术将线程 id 映射到 Java 线程。
在 Java 线程中获取 Java 线程的 Linux 线程 ID 涉及使用本机代码。 但我不认为你需要达到那个水平来获得你需要的信息。
我很困惑你为什么要这样做。 这类信息不太可能帮助您调试 web 应用程序。 如果您这样做是因为您怀疑存在安全问题……请您的开发人员“请解释”意外的 TCP / 侦听意外的端口。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.