JAVA-网络编程-UDP通信 DatagramPacket类和DatagramSocket类

JAVA-网络编程-UDP通信 DatagramPacket类和DatagramSocket类


DatagramPacket类

  • 此类表示数据报包。
  • 数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。不对包投递做出保证。
    构造方法

构造方法

方法 说明
DatagramPacket(byte[] buf, int length) 构造 DatagramPacket,用来接收长度为 length 的数据包
DatagramPacket(byte[] buf, int length, InetAddress address, int port) 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号

方法

返回值类型 方法 说明
InetAddress getAddress() 返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的
byte[] getData() 返回数据缓冲区
int getLength() 返回将要发送或接收到的数据的长度
int getPort() 返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的

DatagramSocket类

  • 此类表示用来发送和接收数据报包的套接字。
  • 数据报套接字是包投递服务的发送或接收点。每个在数据报套接字上发送或接收的包都是单独编址和路由的。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。
  • 在 DatagramSocket 上总是启用 UDP 广播发送。为了接收广播包,应该将 DatagramSocket 绑定到通配符地址。在某些实现中,将 DatagramSocket绑定到一个更加具体的地址时广播包也可以被接收。

构造方法

方法 说明
DatagramSocket() 构造数据报套接字并将其绑定到本地主机上任何可用的端口
DatagramSocket(int port) 创建数据报套接字并将其绑定到本地主机上的指定端口

方法

返回值类型 方法 说明
void receive(DatagramPacket p) 从此套接字接收数据报包
void send(DatagramPacket p) 从此套接字发送数据报包

代码

发送数据包类

public class UDPsend2 {

	public static void main(String[] args) throws IOException {
		// 输入信息并发送
		Scanner sc = new Scanner(System.in);
		while (true) {
			// 数据
			byte[] bytes = sc.next().getBytes();
			
			// 数据包
			InetAddress inet = InetAddress.getByName("127.0.0.1");
			DatagramPacket dp = new DatagramPacket(bytes, bytes.length, inet, 7888);
			
			// 发送平台
			DatagramSocket ds = new DatagramSocket();
			
			// 发送
			ds.send(dp);
		}
        // while(true) 永远不会轮到释放资源代码
    	// replace
    	ds.close();
	}

}

接收数据包类

public class UDPrecieve2 {

	public static void main(String[] args) throws IOException {
		
		// 接收平台
		DatagramSocket ds = new DatagramSocket(7888);
		// 数据包
		byte[] bytes = new byte[1024];
		DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
		while (true) {
			// 接收
			ds.receive(dp);
			// 解包输出
			InetAddress inet = dp.getAddress();
			int port = dp.getPort();
			int len = dp.getLength();
			String str = new String(bytes, 0, len);
			System.out.println("ip:"+inet.getHostAddress()+",port:"+port+",str:"+str);
		}
	}
}

思路:

发送数据时,先将数据、数据大小、对方主机名、端口号装入DatagramPacket实例中,然后用DatagramSocket发送出去。因为采用UDP协议无连接,报文自己去找收件地址,所以DatagramSocket只需要发送。
接收数据时,要先使用DatagramSocket带上端口号来进行接收UDP广播,接收到之后用DatagramPacket接收放入缓冲区(数组),再解包输出就可以了。

posted @ 2020-04-27 10:31  于大宝执剑江湖  阅读(427)  评论(0)    收藏  举报