1 UDP的定义
UDP (User Datagram Protocol)是一个无连接 的传输层协议,提供了无连接通信,且不对传送数据包进行可靠性保证,适合于一次传输少量数据。UDP报文没有可靠性保证、顺序保证和流量控制字段等,可靠性较差 。但是正因为UDP协议的控制选项较少,在数据传输过程中延迟小 、数据传输效率高 ,适合对可靠性要求不高的应用程序。
2 报文传输模拟动态图
有需要查看TCP面向连接实现双人聊天的小伙伴,可直接点击<IT_WEH_coder>的博文[网络编程(利用TCP实现简单的双人聊天)链接]
3 主要应用
(1)适用场合 音频、视频和普通数据在传送时使用UDP,比如我们聊天用的QQ就是使用的UDP协议。 (2)实际应用 应用于现场测控领域,面向的是分布化的控制器、监测器等。在现场通信中,若某一应用要将一组数据传送给网络中的另一个节点,可由UDP进程将数据加上报头后传送给IP进程,UDP协议省去了建立连接和拆除连接的过程,取消了重发检验机制,能够达到较高的通信速率。
4 实例代码
客户端1号代码:
package com.weh.demo05;
public class TestClient01 {
public static void main(String[] args) {
new Thread(new UDPSender(1111,"localhost",2222)).start();
new Thread(new UDPReceiver(3333,"TestClient02")).start();
}
}
客户端2号代码:
package com.weh.demo05;
public class TestClient02 {
public static void main(String[] args) {
new Thread(new UDPSender(4444,"localhost",3333)).start();
new Thread(new UDPReceiver(2222,"TestClient01")).start();
}
}
发送端代码:
package com.weh.demo05;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
import java.nio.charset.StandardCharsets;
public class UDPSender implements Runnable{
DatagramSocket socket = null;
BufferedReader reader = null;
private int localPort;
private final String localIP;
private final int sendPort;
public UDPSender(int localPort, String localIP, int sendPort) {
this.localPort = localPort;
this.localIP = localIP;
this.sendPort = sendPort;
try {
socket = new DatagramSocket(localPort);
reader = new BufferedReader(new InputStreamReader((System.in)));
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (true) {
try {
String dataline = reader.readLine();
byte[] datapacket = dataline.getBytes(StandardCharsets.UTF_8);
DatagramPacket packet = new DatagramPacket(datapacket,0,datapacket.length,new InetSocketAddress(this.localIP,this.sendPort));
socket.send(packet);
if (dataline.equals("End!")) {
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
socket.close();
}
}
接收端代码:
package com.weh.demo05;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class UDPReceiver implements Runnable{
DatagramSocket socket = null;
private int receiverPort;
private final String receiver;
public UDPReceiver(int receiverPort, String receiver) {
this.receiverPort = receiverPort;
this.receiver = receiver;
try {
socket = new DatagramSocket(receiverPort);
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
boolean flag = true;
while (true) {
try {
byte[] database = new byte[1024];
DatagramPacket packet = new DatagramPacket(database,0,database.length);
socket.receive(packet);
if (flag){
System.out.println("\033[1;93;45m" + "对方在线中"+"\033[m");
flag=false;
}
String Data = new String(packet.getData(),0,packet.getLength());
if (Data.equals("End!")) {
System.err.println("对方已离线");
break;
}else {
System.out.println("\033[1;94m" +receiver+":"+Data);
}
} catch (IOException e) {
e.printStackTrace();
}
}
socket.close();
}
}
5 效果展示
博主后记: 希望看到此篇博文的网友,如果发现有什么不对的地方,欢迎在下方留言指正!博主一定虚心接受并改正!大家一起共同进步。如果对你有所帮助,可以给博主一个赞👍。
|