(1)Java中为UDP协议提供的编程类是DatagramSocket,这个被放在java.net包中。
(2)DatagramSocket类有三个构造方法:
(1) public DatagramSocket() throws SocketException
(2) public DatagramSocket(int port) throws SocketException
(3) public DatagramSocket(int port, InetAddress laddr) throws SocketException
使用第一种构造方法:如果UDP程序不用事先接收对方发送的数据,而是主动先对对方发送数据,可选择构造方法(1);
对于第一种构造方法:没有指定端口号,系统就会分配一个还没有被其他网络程序使用的端口号。
(3)如果不使用某个Socket,要调用DatagramSocket.close()关闭这个Socket。
(4)在发送数据时,要调用DatagramSocket.send()方法,send()方法的格式:
public void send(DatagramPacket p) throws IOException
(5)在接收数据时,要调用DatagramSocket.receive()方法,receive()方法的格式:
public void receive(DatagramPacket p) throws IOException
(6)类DatagramPacket,给出两种构造函数,分别用于发送数据和接收数据:
- 接收数据:public DatagramPacket(byte [] buf, int length)
注意;创建一个接收length长度数据的DatagramPacket对象,length必须小于或等于buf.length。 - 发送数据:public DatagramPacket(byte [] buf, int length, InetAddress address, int port)
- 注意:发送数据时,我们不需要知道目的IP地址和端口号。创建一个发送数据包,数据的长度为length,
接收的端口号为port,目的IP地址为InetAddress类的一个实例对象address。length必须小于或等于buf.length。
(7)InetAddress类:是用于表示计算地址的一个类。
- 在发送数据是时,要使用类InetAddress产生一个示例对象。
- InetAddress.getByName(String str)这个静态方法返回一个InetAddress类的实例对象。
- 第一种:直接调用方法InetAddress.getByName(“192.168.0.1”)。
- 第二种;首先,返回一个以“.”点号为分隔符的IP地址字符串:String ipAddress = InetAddress.getLocalHost().getHostAddress();
然后,调用方法InetAddress.getLocalHost(String str):InetAddress.getLocalHost(ipAddress)。
(8)如何知道发送方的IP地址和端口号?
- 由于源(目的)IP地址和源(目的)端口号都被封装在UDP数据包中,因此:
获取发送方的IP地址:DatagramPacket.getInetAddress();
获取发送方的端口号:DatagramPacket.getPort();
(9)示例
//发送端
import java.net.*;
public class UdpSend
{
public static void main(String[] args) throws Exception
{
DatagramSocket ds = new DatagramSocket();
String str = "hello world 中国我爱你!";
byte [] sendData = str.getBytes();
// 获取IP地址
String ipAddress = InetAddress.getLocalHost().getHostAddress();
ds.send(new DatagramPacket(sendData,sendData.length,InetAddress.getByName(ipAddress),3000));
//手动设置IP地址
//ds.send(new DatagramPacket(sendData,sendData.length,InetAddress.getByName("202.117.131.7"),3000));
ds.close();
}
}
//接收端
import java.net.*;
public class UdpRecv
{
public static void main(String[] args) throws Exception
{
DatagramSocket ds = new DatagramSocket(3000);//接收指定端口的数据
byte [] dataBuffer = new byte[1024];
DatagramPacket dp = new DatagramPacket(dataBuffer,1024);
ds.receive(dp);
String strRecv = new String(dp.getData(),0,dp.getLength()) + " from " +
dp.getAddress().getHostAddress() + ":" +dp.getPort();
System.out.println(strRecv);
ds.close();
}
}
(10)编译和运行方法:
- 首先,两个文件一起编译:>javac UdpSend.java UdpRecv.java。
- 其次:运行接收程序:在编译的CMD命令窗口输入start,打开另外一个命令窗口,在新的窗口中运行接收程序>java UdpRecv。
- 最后,在原来的命令窗口运行发送程序:>java UdpSend。