Java网络编程笔记--实现UDP广播发送与接收

Java网络编程笔记

启用UDP广播发送下通信编程

UDP(User Datagram Protocol)用户数据报协议

特点:
	将数据及源和目的封装数据名中,不需要建立连接
	每个数据报的大小限制在65k内
	因为无连接,所以是不可靠协议
	不需要建立连接,所以传输数度快

在java中要启用UDP广播发送通信主要用到的类有

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

实现思路

注意事项:
1.发送端:udp协议通信,要保证数据不丢失,要先运行接收端代码块,且发送端和接收端的端口号一定要相同。
	1.1创建类DatagramSocket的对象,用于调用send(数据报包)方法,发送数据报包;
	1.2创建数据(byte[] buf);
	1.3创建类DatagramPacket的对象,用于调用构造方法DatagramPacket(byte[] buf, int offset, int length, SocketAddress address)构造数据
	报包,将长度为 length 的包发送到指定主机上的指定端口号;
2.接收端:
	2.1创建类DatagramSocket的对象,用于调用receive(数据报包)方法,接收数据报包;
	2.2创建缓冲区存储数据
	2.2创建类DatagramPacket的对象,用于调用构造方法DatagramPacket(byte[] buf, int length),来接收长度为 length 的数据包。
	2.3通过getData()方法返回数据缓冲区,将数据报包返回成数据记录在字节数组中,后通过String的构造方法形成新的String数据打印。

示例代码如下:

//发送端代码
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class UDPSendDemo{
	//注意事项:udp协议通信,要保证数据不丢失,要先运行接收端代码块
	public static void main(String[] args){
		try{
			//创建DatagramSocket类对象,此类表示用来发送和接收数据报包的套接字。
			DatagramSocket ds=new DatagramSocket();
			//创建要发送的数据,并将数据打包
			byte[] data="hello,我就是发送端要发送的数据".getBytes();
			//DatagramPacket类表示数据报包,用来实现无连接包投递服务。
			//DatagramPacket(byte[] buf, int offset, int length, SocketAddress address)
			//该构造方法表示 构造数据报包
			//用来将长度为 length 偏移量为 offset 的包发送到指定主机上的指定端口号。
			DatagramPacket dp=new DatagramPacket(data,0,data.length,InetAddress.getByName("192.168.1.118"),10000);
			//socket对象通过send方法发送数据报包dp
			ds.send(dp);
			//关闭资源
			ds.close();
			//捕获错误
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}


//接收端代码
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UDPReceiveDemo{
	public static void main(String[] args) {
		//依然创建DatagramSocket类对象,因为此类表示用来发送和接收数据报包的套接字。
		//为了让捕获异常后的try代码块的finally可调用对象ds,故先创建对象,下面再建立实例
		DatagramSocket ds=null;
		try{
			//创建数据报套接字并将其绑定到本地主机上的指定端口10000(对应发送端创建的端口)
			ds=new DatagramSocket (10000);
			//创建字节数组以做数据缓冲区
			byte[] words=new byte[1024];
			//创建DatagramPacket类对象,并调用构造器用来接收长度为 length 的数据包
			DatagramPacket dp=new DatagramPacket(words,0,words.length);
			//调用DatagramSocket类方法receive()接收数据报包
			ds.receive(dp);
			//再将数据报包转换成字节数组
			byte[] data=dp.getData();
			//通过使用平台的默认字符集解码data字节数组,方便打印输入
			String str=new String(data,0,data.length);
			System.out.println(str);
		} catch (SocketException e) {
			e.printStackTrace();
		}catch (IOException e) {
			e.printStackTrace();
		}finally{
			if(ds!=null){
				ds.close();
			}
		}
	}
}

你可能感兴趣的:(笔记)