java UDP 编程
DatagramSocket的构造器。
DatagramSocket(int port, InetAddress laddr):创建一个DatagramSocket实例,并将该对象绑定到指定IP地址、指定端口。
//都早localhost内测试
//发送端,不用着急加入数据,将数据放在packet里
DatagramSocket socket = new DatagramSocket();
//接收端
DatagramSocket socket = new DatagramSocket(9090);
收发函数
一旦得到了DatagramSocket实例之后,就可以通过如下两个方法来接收和发送数据。
receive(DatagramPacket p):从该DatagramSocket中接收数据报。
send(DatagramPacket p):以该DatagramSocket对象向外发送数据报。
DatagramPacket
由上面两个函数的参数可以看出,并不能通过首发函数直接进行数据的传输,需要借助DatagramPacket存储数据,进而传输
DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port):创建一个用于发送的DatagramPacket对象,指定发送buf字节数组中从offset开始,总共length个字节,目的ip地址address, 目的端口号port。
//发送端
// 创建一个发送数据的DatagramPacket对象
DatagramPacket packet = new DatagramPacket(buf, length, address, port);
// 发送数据报
socket.send(packet);
//接收端
// 创建一个接收数据的DatagramPacket对象
DatagramPacket packet=new DatagramPacket(buf, 256);
// 接收数据报
socket.receive(packet);
获取发送者信息
UDP面向非连接的,但是在接收端,程序可以调用DatagramPacket的如下3个方法来获取发送者的IP地址和端口。
1.InetAddress getAddress():当程序准备发送此数据报时,该方法返回此数据报的目标机器的IP地址;当程序刚接收到一个数据报时,该方法返回该数据报的发送主机的IP地址。
2.int getPort():当程序准备发送此数据报时,该方法返回此数据报的目标机器的端口;当程序刚接收到一个数据报时,该方法返回该数据报的发送主机的端口。
3.SocketAddress getSocketAddress():当程序准备发送此数据报时,该方法返回此数据报的目标SocketAddress;当程序刚接收到一个数据报时,该方法返回该数据报的发送主机的SocketAddress。
public class UDPTest {
//发送端
@Test
public void send() throws IOException {
//不用加参数,将数据放在packet里
DatagramSocket socket = new DatagramSocket();
//记录对方的ip地址和端口号
String str = "我是UDP";
byte[] data = str.getBytes();
InetAddress inet = InetAddress.getLocalHost();
//封装一个数据报
DatagramPacket packet = new DatagramPacket(data, 0, data.length, inet, 9090);
//发送
socket.send(packet);
socket.close();
}
@Test
public void receiver() throws IOException {
DatagramSocket socket = new DatagramSocket(9090);
byte[] buffer = new byte[100];
DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
socket.receive(packet);
//利用getData()得到接受的信息
System.out.println(new String(packet.getData(), 0, packet.getLength()));
socket.close();
}
}