当前位置: 首页 > 知识库问答 >
问题:

哪个Java线程监听哪个端口?

郜玉石
2023-03-14

我有一个Tomcat 9.0.60服务器,运行在Linux上的OpenJDK 1.8.0上,其中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的一些东西,但并没有走得很远——可能是因为我经验不足。

你能给我一些提示-或者一个完整的解决方案-我如何找到端口到线程的映射?

我不需要自动化,这更像是偶尔的手动留档和检查工作。

共有1个答案

秋飞鸾
2023-03-14

如果我要弄清楚Java线程正在监听什么,我会尝试以下操作:

>

  • 在Web应用程序代码库中搜索使用ServerSocket类的Java代码,然后向后查找负责的应用程序代码。

    使用jstack(或类似工具)捕获所有Java线程堆栈的快照。然后扫描它们以查找在调用accept方法时被阻塞的线程。

    lsof-K选项一起使用,以获取l侦听线程的线程id,然后使用jstack和如何通过已知的PID/TID获取JVM线程名/id中描述的技术将线程id映射到Java线程。

    在Java线程中获取Java线程的Linux线程ID需要使用本机代码。但是我认为您不需要深入到那个级别来获取所需的信息。

    我很困惑你为什么要这样做。这种信息不太可能帮助你调试网络应用程序。如果你这样做是因为你怀疑有安全问题...请你的开发人员“解释”意外端口上的意外TCP/侦听。

  •  类似资料:
    • 当您没有在客户端的io.connect()函数中指定端口时,客户端将监听哪个端口? 例如: 我问的原因是因为我在Heroku上部署了这个应用程序的服务器端。前端是一个IOS应用程序。我在前端使用的objective C socketIO库(https://github.com/pkyeck/socket.io-objc)要求我指定一个端口。但我不确定应该监听哪个端口,因为这在服务器端不是静态的。

    • 问题内容: 对于Java对象,有没有办法告诉哪个线程(或null)当前 拥有其监视器?或者至少是一种方法来判断当前线程是否拥有它? 问题答案: 我自己找到了一些答案。要测试当前线程是否拥有 监视器,是否 存在! exists! 这确实非常快(亚微秒),并且从1.4开始就可用。 通常,要测试哪个线程(或线程ID)持有该锁,可以 对 classes (thanks @amicngh). 有一些注意事项

    • 问题内容: 假设您的Java程序占用了100%的CPU。它有50个线程。您需要查找哪个线程有罪。我没有找到可以提供帮助的工具。当前,我使用以下非常耗时的例程: 运行,其中pid是Java进程的进程ID。找到它的简单方法是运行JDK-中包含的另一个实用程序。最好将jstack的输出重定向到文件。 搜索“可运行”线程。跳过那些在套接字上等待的对象(由于某些原因,它们仍被标记为可运行)。 重复步骤1和2

    • 例如,我可以启动两个程序侦听端口371。第二个没有任何问题地启动并接收传入连接,而第一个没有。一旦最后开始的进程终止,第一个接收它们。 假设这是Windows(XP)行为,它怎么可能是安全的行为呢?这意味着人们可以“过载”任何已经侦听的端口,而不是获得通常的“地址已经在使用”错误消息,并简单地绕过防火墙,规则只是说“允许端口371上的任何传入TCP连接”。

    • 问题内容: 我有2个线程(线程1和线程2)。而且我有信号处理。每当发生线程2时,都应处理该信号。为此,我写了下面的程序 我编译并运行该程序。每1秒打印一次“ thread1 active”,每3秒打印一次“ thread2 active”。 现在我生成了。但是它会像上面那样显示“ thread1 active”和“ thread2 active”消息。再次生成了,现在每3秒仅打印一次“ threa

    • 如果答案是否定的,JOptionPane不属于GUI显示吗?