java中如何检测本机指定的UDP服务端口是否被占用?并且自动分配一个可用udp端口;

java中如何检测本机指定的UDP服务端口是否被占用?并且自动分配一个可用udp端口;,第1张

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。

希望对您有帮助谢谢

使用 DatagramSocket(int port) 建立socket(套间字)服务。

将数据打旦吵配包到DatagramPacket中去

通过socket服务发送 (send()方法)

关闭资源

public static void main(String[] args) {

DatagramSocket ds = null //建立套间字udpsocket服务

try {

ds = new DatagramSocket(8999) //实例化套间字,指定自己的port

} catch (SocketException e) {

System.out.println("Cannot open port!")

System.exit(1)

}

byte[] buf= "Hello, I am sender!".getBytes() //数据

InetAddress destination = null

try {

destination = InetAddress.getByName("192.168.1.5") //需要发送的地址

} catch (UnknownHostException e) {

System.out.println("Cannot open findhost!")

System.exit(1)

}

DatagramPacket dp =

new DatagramPacket(buf, buf.length, destination , 10000)

//打包到DatagramPacket类型中(DatagramSocket的send()方法接受此类,注意10000是接受地址的端口,不同于自己的端口!)

try {

ds.send(dp) //发送数据

} catch (IOException e) {

}

ds.close()

}

}

接收步骤:

使用 DatagramSocket(int port) 建立socket(套间字)服务。(我们注意到此服务即可以接收,又可以发送),port指定监视接受端口。

定义一个数据包(DatagramPacket),储存接收到的数据,使用其中的方法提取传送的内容

通过DatagramSocket 的receive方法将接受到的数据存入上面定义的包中

使用DatagramPacket的方法,提模指取数据。

关闭资源。

import java.net.*

public class Rec {

public static void main(String[] args) throws Exception {

DatagramSocket ds = new DatagramSocket(10000) //定义服务,监视端口上面的发送端口,注意不是send本身端口

byte[] buf = new byte[1024]//接受内容的大小,注意不要溢出

DatagramPacket dp = new DatagramPacket(buf,0,buf.length)//定义一个接收的包

ds.receive(dp)//将接受内容封装到包中

String data = new String(dp.getData(), 0, dp.getLength())//利用getData()方法取出内容碰扒

System.out.println(data)//打印内容

ds.close()//关闭资源

}

}

希望能够帮助到你,望采纳!


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12325197.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存