我的服务器进程中的另一个线程侦听我的主线程知道其数量的特定端口。主线程无法访问由另一个线程打开的实际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中。但这显然是不我的情况。
答案 0 :(得分:0)
答案是否定的。如果您无权访问Socket
或ServerSocket
对象,则无法通过平台独立方式查询java中套接字的连接状态。
答案 1 :(得分:-1)
答案是肯定的。您需要一个SNMP库,通过它可以查询TCP连接表,找出netstat
可以告诉您的所有内容,是的,这是独立于平台的。
然而,这太过分了。所有你应该知道的关于套接字是否仍然连接,只有有权访问套接字的代码才需要知道。如果真的有必要,该代码可以在全局表中维护状态以获取程序其余部分的信息。您不希望将SNMP构建到服务器应用程序中,除非它非常特殊。
此外,您实际陈述的问题没有意义:
'有没有办法获得套接字连接的状态...给出它的端口号'
这基本上没有意义。套接字连接是ESTABLISHED,句点,但任何给定的端口可以同时处于多个状态,因为有一个LISTENING套接字和任何数量的已接受套接字全部使用它,任何一个都可以处于任何状态。查看服务器上的任何netstat
显示。
我的服务器进程中的另一个线程侦听我的主线程知道其数量的特定端口。主线程无法访问由另一个线程打开的实际Socket对象,它只知道它将侦听的本地端口的数量。
如果另一个帖子是listening
,则它有一个ServerSocket
,而不是Socket
。
有没有办法找出这个套接字的状态?我真的只关心它是否倾听与连接/建立。
如果它是ServerSocket
正在收听。如果存在当前连接,则还连接了Socket
,并且这两个端口都使用相同的端口。
重新评论:
通过州我的意思是倾听和连接
现在这没有意义。您只对服务器中的所有套接字使用一个端口:其中一个正在侦听,其余部分已连接。这些信息可能无用。
但是你总是不正确地讨论套接字。
是的,他是。
当然,大多数情况下都是典型的服务器。
所有TCP服务器。
但在这种情况下,一次只允许一个客户端。
没有任何区别。您接受的套接字正在侦听:您从其接受的套接字已连接。一次允许的连接数无关紧要。
因此绑定到我感兴趣的端口的套接字将处于LISTEN或ESTABLISHED ...
或两者兼而有之,因为当有连接时,至少有两个套接字绑定到端口。
你仍然没有意义。