UDP协议
UDP协议的特点是什么
用户数据报协议(User Datagram Protocol)
UDP是面向无连接,不可靠传输的通信协议。
速度快,有大小限制一次最多发送64K,数据不安全,易丢失数据。
UDP协议的特点
UDP是一种无连接、不可靠传输的协议。
将数据源IP、目的地IP和端口以及数据封装成数据包,大小限制在64KB内,直接发送出去即可
DatagramPacket:数据包对象(韭菜盘子)
public DatagramPacket(byte[] buf, int length, InetAddress address, int port)
创建发送端数据包对象
buf:要发送的内容,字节数组
length:要发送内容的字节长度
address:接收端的IP地址对象
port:接收端的端口号
public DatagramPacket(byte[] buf, int length)
创建接收端的数据包对象
buf:用来存储接收的内容
length:能够接收内容的长度
DatagramSocket:发送端和接收端对象(人)
DatagramSocket类成员方法
使用UDP通信实现:发送消息、接收消息
创建DatagramSocket对象(发送端对象) 扔韭菜的人
创建DatagramPacket对象封装需要发送的数据(数据包对象) 韭菜盘子
使用DatagramSocket对象的send方法传入DatagramPacket对象 开始抛出韭菜
释放资源
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | package com.itheima.d2_udp1; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; /** 发送端 一发 一收 */ public class ClientDemo1 { public static void main(String[] args) throws Exception { System.out.println( "=====客户端启动======" ); // 1、创建发送端对象:发送端自带默认的端口号(人) DatagramSocket socket = new DatagramSocket( 6666 ); // 2、创建一个数据包对象封装数据(韭菜盘子) /** public DatagramPacket(byte buf[], int length, InetAddress address, int port) 参数一:封装要发送的数据(韭菜) 参数二:发送数据的大小 参数三:服务端的主机IP地址 参数四:服务端的端口 */ byte [] buffer = "我是一颗快乐的韭菜,你愿意吃吗?" .getBytes(); DatagramPacket packet = new DatagramPacket( buffer, buffer.length, InetAddress.getLocalHost() , 8888 ); // 3、发送数据出去 socket.send(packet); socket.close(); } } |
使用UDP通信实现:发送消息、接收消息
需求:接收端实现步骤
创建DatagramSocket对象并指定端口(接收端对象) 接韭菜的人
创建DatagramPacket对象接收数据(数据包对象) 韭菜盘子
使用DatagramSocket对象的receive方法传入DatagramPacket对象 开始接收韭菜
释放资源
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | package com.itheima.d2_udp1; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; /** 接收端 */ public class ServerDemo2 { public static void main(String[] args) throws Exception { System.out.println( "=====服务端启动======" ); // 1、创建接收端对象:注册端口(人) DatagramSocket socket = new DatagramSocket( 8888 ); // 2、创建一个数据包对象接收数据(韭菜盘子) byte [] buffer = new byte [ 1024 * 64 ]; DatagramPacket packet = new DatagramPacket(buffer, buffer.length); // 3、等待接收数据。 socket.receive(packet); // 4、取出数据即可 // 读取多少倒出多少 int len = packet.getLength(); String rs = new String(buffer, 0 , len); System.out.println( "收到了:" + rs); // 获取发送端的ip和端口 String ip =packet.getSocketAddress().toString(); System.out.println( "对方地址:" + ip); int port = packet.getPort(); System.out.println( "对方端口:" + port); socket.close(); } } |
使用UDP通信实现:多发多收消息
需求
使用UDP通信方式开发接收端和发送端。
分析
发送端可以一直发送消息。
接收端可以不断的接收多个发送端的消息展示。
发送端输入了exit则结束发送端程序。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | package com.itheima.d3_udp2; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.MulticastSocket; import java.util.Scanner; /** 发送端 多发 多收 */ public class ClientDemo1 { public static void main(String[] args) throws Exception { System.out.println( "=====客户端启动======" ); // 1、创建发送端对象:发送端自带默认的端口号(人) DatagramSocket socket = new DatagramSocket( 7777 ); Scanner sc = new Scanner(System.in); while ( true ) { System.out.println( "请说:" ); String msg = sc.nextLine(); if ( "exit" .equals(msg)){ System.out.println( "离线成功!" ); socket.close(); break ; } // 2、创建一个数据包对象封装数据(韭菜盘子) byte [] buffer = msg.getBytes(); DatagramPacket packet = new DatagramPacket( buffer, buffer.length, InetAddress.getLocalHost() , 8888 ); // 3、发送数据出去 socket.send(packet); } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | package com.itheima.d3_udp2; import java.net.DatagramPacket; import java.net.DatagramSocket; /** 接收端 */ public class ServerDemo2 { public static void main(String[] args) throws Exception { System.out.println( "=====服务端启动======" ); // 1、创建接收端对象:注册端口(人) DatagramSocket socket = new DatagramSocket( 8888 ); // 2、创建一个数据包对象接收数据(韭菜盘子) byte [] buffer = new byte [ 1024 * 64 ]; DatagramPacket packet = new DatagramPacket(buffer, buffer.length); while ( true ) { // 3、等待接收数据。 socket.receive(packet); // 4、取出数据即可 // 读取多少倒出多少 int len = packet.getLength(); String rs = new String(buffer, 0 , len); System.out.println( "收到了来自:" + packet.getAddress() + ", 对方端口是" + packet.getPort() + "的消息:" + rs); } } } |
=====客户端启动======
请说:
ad
请说:
aldk
请说:
oqiwuieu
请说:
=====服务端启动======
收到了来自:/127.0.0.1, 对方端口是7777的消息:ad
收到了来自:/127.0.0.1, 对方端口是7777的消息:aldk
收到了来自:/127.0.0.1, 对方端口是7777的消息:oqiwuieu
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程使用 AI 从 0 到 1 写了个小工具
· 快收藏!一个技巧从此不再搞混缓存穿透和缓存击穿
· AI 插件第二弹,更强更好用
· Blazor Hybrid适配到HarmonyOS系统
· 支付宝 IoT 设备入门宝典(下)设备经营篇