Java关于UDP协议的基本介绍
目录
前言
此篇基本介绍了关于udp协议的基本特点以及其核心api实现了一个回响服务器和回响客户端。关于其中的介绍如果有疏漏或者错误欢迎大家评论区留言
关于UDP协议的介绍
UDP(User Datagram Protocol,用户数据报协议)是一种无连接的传输层协议,提供简单的、不可靠的数据传输服务。与TCP不同,UDP不保证数据包的顺序、可靠性或重复控制,但具有低延迟和高效率的特点。
DUP协议的特点
无连接:发送数据前不需要建立连接,直接发送
不可靠:不保证数据送达,不保证顺序,可能会丢包或者重复
面向数据报:以数据报问单位传输,大小通常为64kb
全双工:双方可以同时发送收到数据
传输效率搞:没有连接维护和重传机制,延迟低
Java UDP的核心API
DatagramSocket
(用于发送和接受UDP数据报的套接字)
对于DatagramSocket实例化出来的对象一般实现三个目的
1.绑定对应的端口
2.通过receive方法接受数据报
3.通过send方法发送数据报
DatagramPacket
数据报(包含数据、长度、地址、端口)
对于Datagrampacket实例化出来的对象要实现两个功能
1.充当容器使用,用于存放要发送的数据报
2.发包,(作用类似于包裹)需要绑定对端的ip和port
UDP实现回响客户端和回响服务器的通信
回响服务器:网络版复读机,发什么回什么
回响服务器的实现
实现回响服务器的四大基本步骤
1.接收客户端发送的请求并解析
2.根据请求并计算出响应
3.发送响应回到客户端
4.打印日志
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class test2 {
public static void main(String[] args) throws IOException {
UdpS server = new UdpS(1234);//端口自定义
server.start();
}
}
class UdpS{
private int port;
DatagramSocket socket;
public UdpS(int port) throws SocketException {
socket = new DatagramSocket(port);
}
public void start() throws IOException {
System.out.println("服务器启动");
while(true){
//1.接受客户端发来的请求
DatagramPacket packet = new DatagramPacket(/*填入容器的大小*/new byte[4096],4096);
socket.receive(packet);
//把请求转换成String形式
String request = new String(packet.getData(),0,packet.getLength());
//2.计算响应(此处是处理过程)
//由于是回响服务器,返回的内容就是发送的请求
String response = progess(request);
//3.发送响应回到客户端
DatagramPacket responsepacket = new DatagramPacket(response.getBytes(),response.getBytes().length,
packet.getSocketAddress());
socket.send(responsepacket);
//4.打印日志
System.out.printf("[%s:%d] req = %s,resp = %s \n",packet.getAddress().toString(),
packet.getPort(), request, response);
}
}
private String progess(String request) {
return request;
}
}
回响客户端的实现
实现回响服务器的四大基本步骤
1.读取用户输入的请求
2.把请求包装成数据报的形式发送给服务端
3.接受服务端的响应
4.把服务端发送的响应转换显示给用户
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
public class test3 {
public static void main(String[] args) throws IOException {
UdpC client = new UdpC("10.8.44.37",1234);
client.start();
}
}
class UdpC{
private int serverport;
private String serverip = "";
DatagramSocket socket = null;
public UdpC(String ip, int port) throws SocketException {
socket = new DatagramSocket();
serverport = port;
serverip = ip;
}
public void start() throws IOException {
System.out.println("客户端启动");
Scanner scanner = new Scanner(System.in);
while(true){
//1.读取用户的请求
System.out.print("->");
String request = scanner.nextLine();
//2.将请求以数据报的形式发送给服务端
DatagramPacket requestpacket = new DatagramPacket(request.getBytes(),request.getBytes().length,
InetAddress.getByName(serverip),serverport);
socket.send(requestpacket);
//3.获取服务端发送的响应
DatagramPacket responsepacket = new DatagramPacket(new byte[4096],4096);
socket.receive(responsepacket);
//4.将响应转化成字符串显示出来
String reponse = new String(responsepacket.getData(),0,responsepacket.getLength());
System.out.println(reponse);
}
}
}
补充:此处的ip写的是一个回环ip,因此可以在本地同时运行客户端和服务端,回环ip也可以改写成本地的ipv4码。如果要实现跨主机传输信息就要在客户端主机下写入目标主机的ip并且在同一个局域网下才可以实现。如果要远程异地传输信息就需要借用到虚拟组网软件,同时把ip改写成虚拟组网软件提供的虚拟ip即可
总结
重点掌握服务端和客户端的实现过程以及其基本原理,注意客户端的socket对象需要绑定服务端的port,而客户端的socket对象不用绑定,取而代之的是客户端的responsepacket需要绑定服务端的ip和port。
更多推荐
所有评论(0)