我的服务器进程中的另一个线程监听我的主线程知道数量的特定端口。主线程无法访问其他线程打开的实际 Socket
对象,它只知道它要监听的本地端口号。
有没有办法找出这个套接字的状态?我真的只关心它是在听还是在连接/建立。但是可以访问此处列出的所有州:https://github.com/mss/java-netstat/blob/master/src/main/java/de/msquadrat/netstat/ConnectionState.java会很好。
现在您可能会问为什么我不直接使用该项目,因为它似乎完全符合我的要求。嗯,它只适用于 linux(或公开相同 /proc/net
文件系统的系统)。我需要跨平台的东西。
编辑:回应下面的一些评论。我无权访问正在监听或连接的线程中的任何对象。我无权访问该代码,因此我无法自己保留连接状态的全局表。是的,连接将处于 LISTEN 或 ESTABLISHED 状态。一次只能有一个连接的客户端,当该客户端连接时,服务器代码将不会仍在该端口上监听。这是未连接客户端时 netstat
的输出:
$ netstat -nap | fgrep 10010
tcp 0 0 0.0.0.0:10010 0.0.0.0:* LISTEN 20096/java
和客户端连接时相同的输出:
$ netstat -nap | fgrep 10010
tcp 0 0 192.168.101.94:10010 10.0.42.252:50426 ESTABLISHED 20096/java
为了完整起见,这里有一个更传统的 TCP 服务器在监听时的示例:
$ netstat -nap | fgrep 8080
tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN 20096/java
同一台服务器与一个连接的客户端:
$ netstat -nap | fgrep 8080
tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN 20096/java
tcp 0 0 127.0.0.1:8080 10.0.42.252:60660 ESTABLISHED 20096/java
如您所见,此服务器执行大多数服务器执行的操作,它在接受连接后继续监听。因此,在那种情况下,单个本地端口上将有两个套接字,一个在 LISTEN 中,一个在 ESTABLISHED 中。但这显然不是我的情况。
最佳答案
答案是否定的。如果您无权访问 Socket
或 ServerSocket
对象,则没有平台独立的方法来查询 java 中套接字的连接状态。
关于java - 有没有办法在给定端口号的情况下获取java中套接字连接的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37597079/