java中如何检测本机指定的UDP服务端口是不是被占用?并且自动分配一个可用udp端口;
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中如何检测本机指定的UDP服务端口是不是被占用?并且自动分配一个可用udp端口;相关的知识,希望对你有一定的参考价值。
即java实现:用函数返回一个可用的udp端口(本机客户端)
1.端口占用编译器会报错,可以从错误看出来是不是端口被占用。没有专门的检测工具和方法2.DatagramSocket(在Java中使用UDP协议编程的相关类)
用于接收和发送UDP的Socket实例。该类有3个构造函数:
DatagramSocket():通常用于客户端编程,它并没有特定监听的端口,仅仅使用一个临时的。程序会让操作系统分配一个可用的端口。
DatagramSocket(int port):创建实例,并固定监听Port端口的报文。通常用于服务端
DatagramSocket(int port, InetAddress localAddr):这是个非常有用的构建器,当一台机器拥有多于一个IP地址的时候,由它创建的实例仅仅接收来自LocalAddr的报文。
DatagramSocket具有的主要方法如下:
1)receive(DatagramPacket d):接收数据报文到d中。receive方法产生一个“阻塞”。“阻塞”是一个专业名词,它会产生一个内部循环,使程序暂停在这个地方,直到一个条件触发。
2)send(DatagramPacket dp):发送报文dp到目的地。
3)setSoTimeout(int timeout):设置超时时间,单位为毫秒。
4)close():关闭DatagramSocket。在应用程序退出的时候,通常会主动释放资源,关闭Socket,但是由于异常地退出可能造成资源无法回收。所以,应该在程序完成时,主动使用此方法关闭Socket,或在捕获到异常抛出后关闭Socket。
希望对您有帮助谢谢 参考技术A 使用异常处理 try catch(Exception h) //表示此端口已经被占用了;
测试特定协议下指定端口是不是开启
参考技术A 我们在检测远程服务是否正常时,经常会用一些工具(命令)来检测端口是否开启,来确定服务是否正常。通常可用于检测的工具有nc、socat、nmap等,基本思想是向远端指定端口发送数据,看其状态。远端:192.168.0.15
本端:192.168.0.10
单向检测(适用于无法登录远端服务查看的情况)
如果返回succeeded,则说明相应的UDP端口访问正常。
如果无任何返回信息,则说明相应的UDP端口访问失败。
nc -uvz $IP $Port. //UDP
nc -vz $IP $Port //TCP
远端不监听1777端口情况
# nc -uvz 192.168.0.15 1777
#
远端监听1777端口
# nc -ul 1777
XXXXX
# nc -uvz 192.168.0.15 1777
Connection to 192.168.0.15 1777 port [udp/powerguardian] succeeded!
如果succeeded,则无任何返回,如果failed则返回Connection refused。
echo "This socat udp test." | socat - udp-connect:$IP:$Port
远端不监听1777端口,本端发送udp数据至远端指定端口。
# echo "This socat udp test." | socat - udp-connect:192.168.0.15:1777
2017/06/18 14:26:39 socat[22195] E read(3, 0xb48a20, 8192): Connection refused
远端开启监听,本端再次发送。
# nc -ul 1777
This socat udp test.
# echo "This socat udp test." | socat - udp-connect:192.168.0.15:1777
#
用指定协议扫描远端指定端口
nmap -sU -p $Port $IP
# nmap -sU -p 1777 192.168.0.15
Starting Nmap 5.51 ( http://nmap.org ) at 2017-06-18 14:35 CST
Nmap scan report for host-192-168-0-15 (192.168.0.15)
Host is up (0.00098s latency).
PORT STATE SERVICE
1777/udp closed unknown
MAC Address: FA:16:3E:1A:54:30 (Unknown)
Nmap done: 1 IP address (1 host up) scanned in 0.05 seconds
可以通过传输文本及文件来测试UDP端口是否正常(先开监听,再发送)
远端:nc -ul $Port
本端: nc -u $IP $Port
在本端键入任意字符,看远端是否可以收到。
远端:nc -l $Port > $Filename
本端:nc $IP $Port < $Filename
可以执行md5sum看两端的文件md5是否相同
注:如果是检测tcp协议端口,上述nc命令中,去掉参数-u即可。另外,也可以使用telnet $IP $Port来完成
$ nc -vzw 2 180.76.148.122 22-81 //显示详细信息,包含失败的
$ nc -zw 2 180.76.148.122 22-81 //不显示详细信息,只包含成功的,如果检测udp端口,可用"vzw"参数,"z"参数表示连接成功后立即关闭连接
Connection to 180.76.148.122 port 22 [tcp/ssh] succeeded!
Connection to 180.76.148.122 port 80 [tcp/http] succeeded!
附全面的ncat使用方法: https://linux.cn/article-9190-1.html
以上是关于java中如何检测本机指定的UDP服务端口是不是被占用?并且自动分配一个可用udp端口;的主要内容,如果未能解决你的问题,请参考以下文章