UDP通信
UDP通信原理图解
案例:UDP数据传输
实现步骤:
发送Send
创建DatagramSocket, 随机端口号
创建DatagramPacket, 指定数据, 长度, 地址, 端口
使用DatagramSocket发送DatagramPacket
关闭DatagramSocket
接收Receive
创建DatagramSocket, 指定端口号
创建DatagramPacket, 指定数组, 长度
使用DatagramSocket接收DatagramPacket
关闭DatagramSocket
从DatagramPacket中获取数据
案例:实现UDP的发送和接收
public static void main(String[] args) throws Exception { // 1.发送Send // 创建DatagramSocket, 随机端口号 DatagramSocket sender = new DatagramSocket(); // 创建DatagramPacket【数据包】, 指定数据, 长度, 地址, 端口 String s = "你好吗?最近很想你"; byte[] bs = s.getBytes("UTF-8"); DatagramPacket packet = new DatagramPacket(bs, bs.length, Inet4Address.getByName("192.168.1.125"), 5288); // 使用DatagramSocket发送DatagramPacket sender.send(packet); // 关闭DatagramSockets sender.close(); }
public static void main(String[] args) throws IOException { // 2.接收Receive // 创建DatagramSocket, 指定端口号 DatagramSocket receiver = new DatagramSocket(5288); // 创建DatagramPacket, 指定数组, 长度 byte[] buf = new byte[1024]; DatagramPacket packet = new DatagramPacket(buf, 1024); // 使用DatagramSocket接收DatagramPacket receiver.receive(packet); // 关闭DatagramSocket receiver.close(); // 从PackeDatagramt中获取数据 String s = new String(buf, 0, packet.getLength(), "UTF-8"); System.out.println("接收到数据:" + s); }
案例:添加键盘和死循环功能
public class Demo_Sender { public static void main(String[] args) throws Exception { // 1.发送Send // 创建DatagramSocket, 随机端口号 DatagramSocket sender = new DatagramSocket(); //2 Scanner Scanner scanner = new Scanner(System.in); while(true){ // 创建DatagramPacket【数据包】, 指定数据, 长度, 地址, 端口 System.out.println("输入内容:"); String s = scanner.nextLine(); byte[] bs = s.getBytes("UTF-8"); DatagramPacket packet = new DatagramPacket(bs, bs.length, Inet4Address.getByName("192.168.1.125"), 5288); // 使用DatagramSocket发送DatagramPacket sender.send(packet); } // 关闭DatagramSockets //sender.close(); } } package lesson05; public class Demo_Receiver { public static void main(String[] args) throws IOException { // 2.接收Receive // 创建DatagramSocket, 指定端口号 DatagramSocket receiver = new DatagramSocket(5288); while(true){ // 创建DatagramPacket, 指定数组, 长度 byte[] buf = new byte[1024]; DatagramPacket packet = new DatagramPacket(buf, 1024); // 使用DatagramSocket接收DatagramPacket receiver.receive(packet); // 关闭DatagramSocket //receiver.close(); // 从PackeDatagramt中获取数据 String s = new String(buf, 0, packet.getLength(), "UTF-8"); System.out.println(new Date() + "接收到数据:" + s); } } }
案例:使用双线程来收发数据
public class Demo { public static void main(String[] args) { // 案例:UDP数据传输+键盘和循环+双线程实现(了解) new Receiver().start(); new Sender().start(); } } class Receiver extends Thread { @Override public void run() { // TODO Auto-generated method stub try { // 创建DatagramSocket, 指定端口号 DatagramSocket receiver = new DatagramSocket(5288); while (true) { // 创建DatagramPacket, 指定数组, 长度 byte[] buf = new byte[1024]; DatagramPacket packet = new DatagramPacket(buf, 1024); // 使用DatagramSocket接收DatagramPacket receiver.receive(packet); // 关闭DatagramSocket // receiver.close(); // 从PackeDatagramt中获取数据 String s = new String(buf, 0, packet.getLength(), "UTF-8"); System.out.println(new Date() + "接收到数据:" + s); } } catch (Exception e) { // TODO: handle exception } } } class Sender extends Thread { @Override public void run() { try { // 创建DatagramSocket, 随机端口号 DatagramSocket sender = new DatagramSocket(); //2 Scanner Scanner scanner = new Scanner(System.in); while(true){ // 创建DatagramPacket【数据包】, 指定数据, 长度, 地址, 端口 System.out.println("输入内容:"); String s = scanner.nextLine(); byte[] bs = s.getBytes("UTF-8"); DatagramPacket packet = new DatagramPacket(bs, bs.length, Inet4Address.getByName("192.168.1.125"), 5288); // 使用DatagramSocket发送DatagramPacket sender.send(packet); } } catch (Exception e) { // TODO: handle exception } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?