在计算机网络tcp/ip模型中,udp和tcp处在第三层,也就是网路层中。而udp协议和tcp协议是网路层中最重要和使用最多的协议。
UDP协议(User Datagram Protocol)是面向无连接的通讯协议,特点是速度快,有大小的限制(64kb),数据不安全,已丢失;TCP协议(Transmission Control Protocol)是面向连接的协议,特点与UDP互补,速度慢,没有大小限制,数据安全不易丢失。
在UDP协议的使用中,有三种通信方法,分别是:单播,组播和广播。单播顾名思义就是点对点的通信,是一个计算机对另一个计算机传递信息;组播就是一对多,一个计算机对局域网内多个计算机发送信息;广播就是对局域网内所有计算机发送信息。在这篇博客中,我们主要讨论UDP的原理和单播,组播和广播的分别实现。
udp单播发送端
首先第一步,我们创建一个DatagramSocket对象,类的构造方法可以是无参(表示随机使用可用的端口)或者有参(自选的端口)
DatagramSocket ds = new DatagramSocket();
第二步新建DatagramPacket数据包用来打包我们的数据。在构造器中提供数据的字节码,字节码长度,接收端的ip地址和接收端的端口号。在新建数据包前,我们可以先自定义一个字符串比如“你好”,然后转换成字节码数组提供给数据包(使用.getBytes()来将字符串转换为字节码数组)。接收端ip地址在这里使用的就是本机的地址localhost:127.0.0.1
String data = "你好呀";
byte[] bytes = data.getBytes();
InetAddress address = InetAddress.getByName("127.0.0.1");
int port = 10086;
DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);
然后第三步就可以发送数据包了~
ds.send(dp);
最后第四步释放DatagramSocket资源
ds.close();
udp单播接收端
和发送端类似,首先创建DatagramSocket对象,但是接收端的对象需要提供指定端口号参数(因为在上面我们指定10086作为接收端端口号)
DatagramSocket ds = new DatagramSocket(10086);
第二步还是创建数据包DatagramPacket,这次在接收端只用提供新建的字节码数组和其长度就可以了(长度根据实际情况而定)
byte[] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
第三步就是接收和解析数据包。用ds.receive(dp)方法接收从发送端发送的数据包。然后使用dp中的各种方法来提取我们需要的数据。在提取发送端发送的信息时,getData()方法返回的是字节码,需要用String的构造方法来转换为字符串
ds.receive(dp);
String data = new String(dp.getData());
InetAddress address = dp.getAddress();
int port = dp.getPort();
int length = dp.getLength();
最后一步就是释放资源
ds.close();
这就是用Java实现udp单播的基本方法。在下一个博客中我会记录udp组播和广播的实现