网络编程(2)UDP通信协议
UDP通信协议
1️⃣UDP通信程序
观看下图:喜羊羊要怎么把东西给到村长?
首先要找到码头,然后把所有东西装进包裹中,装进包裹后,包裹上面贴着村长的地址,然后发送包裹
所以,发送礼物(UDP发送数据)的步骤大致如下:
- 找码头-----》创建发送端的
DatagramSocket
对象 - 打包礼物----》创建数据,并把数据打包(
DatagramPacket
) - 由码头发送包裹----》调用
DatagramSocket
对象的方法发送数据 - 付钱走羊-----》释放资源
UDP
发送数据代码演示:
import java.io.IOException;
import java.net.*;
public class ClientDemo{
public static void main(String[] args) throws IOException {
//1、找码头
DatagramSocket ds=new DatagramSocket();
//2、打包礼物
String s="村长的礼物";
byte[] b=s.getBytes();
int port=10000;
InetAddress address=InetAddress.getByName("DESKTOP-LEUS976");
DatagramPacket dp=new DatagramPacket(b,b.length,address,port);
//3、由码头发送包裹
ds.send(dp);
//4、付钱走羊
ds.close();
}
}
村长接收礼物的流程(UDP
接收端接收数据)的大致流程如下:
1、找码头----》创建接收端的DatagramSocket
对象
2、找新箱子----》创建一个箱子DatagramPacket
,用于接收数据
3、码头接收礼物并放入新箱子中---》调用DatagramSocket
的方法接收数据并将数据放入箱子中
4、村长从箱子里获取礼物----》解析数据包,并把数据在控制台显示
5、拿完走羊-----》释放资源
UDP接收数据代码演示:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class ServerDemo {
public static void main(String[] args) throws IOException {
//1、找码头 -----表示接收端从10000端口接收数据的
DatagramSocket ds=new DatagramSocket(10000);
//2、创建新箱子
byte[] bytes=new byte[1024];
DatagramPacket dp=new DatagramPacket(bytes,bytes.length);
//3、接收礼物,把礼物放到新的箱子中
ds.receive(dp);
//4、从新箱子中获取礼物
byte[] data=dp.getData();
int length=dp.getLength();
System.out.println(new String(data,0,length));
//5、拿完走羊
ds.close();
}
}
先运行接收端代码,再运行发送端代码,运行结果如下:
注意:
- 要先运行接收端,再运行发送端
- 如果接收端启动后,没有接收到数据,那么会死等(阻塞)
- 在接收数据的时候,需要调用一个
getLength
方法,表示接收到了多少字节
2️⃣UDP通信程序练习
练习要求:
UDP
发送数据:数据来自于键盘录入,直到输入的数据是886
,发送数据结束UDP
接收数据:因为接收端不知道发送端什么时候停止发送,故采用死循环接收
发送端的代码:
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
public class ClientDemo{
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket();
Scanner sc=new Scanner(System.in);
InetAddress address = InetAddress.getByName("DESKTOP-LEUS976");
int port=10000;
while(true){
String s=sc.nextLine();
if(s.equals("886")){
break;
}
byte[] bytes=s.getBytes();
DatagramPacket dp=new DatagramPacket(bytes,bytes.length,address,port);
ds.send(dp);
}
ds.close();
}
}
接收端的代码:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Scanner;
public class ServerDemo {
public static void main(String[] args) throws IOException {
DatagramSocket ds=new DatagramSocket(10000);
while(true){
byte[] bytes=new byte[1024];
DatagramPacket dp=new DatagramPacket(bytes,bytes.length);
ds.receive(dp);
byte[] data=dp.getData();
int length=dp.getLength();
System.out.println(new String(data,0,length));
}
// ds.close(); 此案例不要这个
}
}
先运行接收端,再运行发送端,运行结果如下:
3️⃣UDP的三种通信方式
单播
组播
广播(发送给局域网中的所有设备)
4️⃣组播的代码实现:
组播地址范围:224.0.0.0~239.255.255.255
,其中224.0.0.0~224.0.0.255
为预留的组播地址,我们不能使用,我们只能使用244.0.1.0
之后的范围。
组播的发送端的代码实现:
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
public class ClientDemo{
public static void main(String[] args) throws IOException {
DatagramSocket ds=new DatagramSocket();
String s="数据";
byte[] bytes=s.getBytes();
int port=10000;
InetAddress address=InetAddress.getByName("224.0.1.0");
DatagramPacket dp=new DatagramPacket(bytes,bytes.length,address,port);
ds.send(dp);
ds.close();
}
}
组播的接收端的代码实现
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
public class ServerDemo {
public static void main(String[] args) throws IOException {
MulticastSocket ms=new MulticastSocket(10000);
ms.joinGroup(InetAddress.getByName("224.0.1.0"));
byte[] bytes=new byte[1024];
DatagramPacket dp=new DatagramPacket(bytes,bytes.length);
ms.receive(dp);
byte[] data = dp.getData();
int length=dp.getLength();
System.out.println(new String(data,0,length));
}
}