【网络编程】UDP Socket编程
UDP Socket编程
- 一. DatagramSocket
- 二. DatagramPacket
- 三. InetSocketAddress
- 四. 执行流程
- 五. 代码示例: UDP 回显服务器
数据报套接字: 使用传输层 UDP 协议
UDP: 即 User Datagram Protocol(用户数据报协议),传输层协议。
UDP的特点:
- 无连接
- 不可靠传输
- 面向数据报
- 全双工
- 有接收缓冲区,无发送缓冲区
- 大小受限:一次最多传输64k
对于数据报来说,可简单理解为,传输的数据是一块一块的,发送一块数据假如100个字节,必须一次发送,接收也必须一次接收100个字节,而不能分100次,每次接收1个字节。
一. DatagramSocket
DatagramSocket 是UDP Socket,用于发送和接收UDP数据报。
构造方法:

方法:

二. DatagramPacket
DatagramPacket是UDP Socket发送和接收的数据报。
构造方法:

方法:

构造UDP发送的数据报时,需要传入 SocketAddress ,该对象可以使用 InetSocketAddress 来创建。
三. InetSocketAddress
InetSocketAddress 是SocketAddress 的子类
构造方法:

四. 执行流程
对于UDP协议来说,具有无连接,面向数据报的特征,即每次都是没有建立连接,并且一次发送全部数据报,一次接收全部的数据报。对于一个服务端来说,重要的是提供多个客户端的请求处理及响应,流程如下:

五. 代码示例: UDP 回显服务器
服务器端代码:
class UdpEchoServer {public DatagramSocket socket;//udp的服务器需要自己指定端口号public UdpEchoServer(int port) throws SocketException {socket=new DatagramSocket(port);}public void start() throws IOException {System.out.println("启动服务器");while(true){//三个步骤//1.接受客户端发来的请求//先构造出数据报(盘子)DatagramPacket requestPacket=new DatagramPacket(new byte[1024],1024);//接收数据socket.receive(requestPacket);//输出型参数, receive 会将数据填充到 requestPacket 中//将数据报解析成一个字符串String request=new String(requestPacket.getData(),0,requestPacket.getLength(),"UTF-8");//注意这里求的长度直接用的是数据报//2.根据请求计算出响应String response=process(request);DatagramPacket responsePacket=new DatagramPacket(response.getBytes(),response.getBytes().length,//注意长度是字节数组的长度requestPacket.getSocketAddress());//注意要加上IP地址和端口,这里合起来写了//3.响应返回给客户端socket.send(responsePacket);System.out.printf("[reqIP:%s req端口号:%d][req:%s resp:%s]\n",requestPacket.getAddress().toString(),responsePacket.getPort(),request,response);}}/*** 根据请求计算响应, 这里面只是模拟, 直接返回了原字符串*/public String process(String request){return request;}public static void main(String[] args) throws SocketException {UdpEchoServer udpEchoServer=new UdpEchoServer(9090);try {udpEchoServer.start();} catch (IOException e) {throw new RuntimeException(e);}}
}
客户端代码:
class UdpEchoClient {public DatagramSocket socket;//服务器的IP地址和端口号,传送数据时需要知道,放在数据报中public String serverIp;public int ServerPort;public UdpEchoClient(String serverIp,int serverPort) throws SocketException {socket=new DatagramSocket();//客户端利用系统随机分配的端口号,防止自己手动的端口号不能用this.serverIp=serverIp;this.ServerPort=serverPort;}public void start() throws IOException {Scanner scanner=new Scanner(System.in);while(true){//五个步骤//1.先接收用户输入的字符串System.out.println("->");String request=scanner.next();//2.构造数据报//注意数据报中除了数据内容还要包含服务器IP和端口DatagramPacket requestPacket=new DatagramPacket(request.getBytes(),request.getBytes().length, InetAddress.getByName(serverIp),ServerPort);//3.客户端发送数据报给服务器socket.send(requestPacket);//4.从服务器接收响应,并解析DatagramPacket responsePacket=new DatagramPacket(new byte[1024],1024);socket.receive(responsePacket);//解析数据String response=new String(responsePacket.getData(),0,responsePacket.getLength(),"UTF-8");//同样注意这里求长度用的也是数据报//5.打印在控制台上System.out.printf("req:%s resp:%s\n",request,response);}}public static void main(String[] args) throws IOException {//如果服务器在其他机器上就需要将IP地址和端口号更改了UdpEchoClient udpEchoClient=new UdpEchoClient("127.0.0.1",9090);udpEchoClient.start();}
}
注意:当然要先启动服务器再启动客户端啦!
好啦! 以上就是对 UDP Socket编程的讲解,希望能帮到你 !
评论区欢迎指正 !
相关文章:
【网络编程】UDP Socket编程
UDP Socket编程 一. DatagramSocket二. DatagramPacket三. InetSocketAddress四. 执行流程五. 代码示例: UDP 回显服务器 数据报套接字: 使用传输层 UDP 协议 UDP: 即 User Datagram Protocol(用户数据报协议),传输层协议。 UDP…...
[GIT]版本控制工具
[GIT]版本控制工具 Git 的命令Git 的配置信息查看现有 Git 配置信息设置 Git 配置信息用户信息配置文本编辑器配置差异分析工具配置 编辑 Git 配置文件 Git 仓库操作初始化 Git 仓库克隆 Git 仓库Git 分支仓库创建Git 远程仓库命令 Git 提交历史Git 标签添加标签查看已有标签删…...
Linux文件管理命令
Linux命令行 命令空格参数(可写可不写)空格文件(可写可不写)ls/opt 根目录下的opt文件夹ls-a 显示所有文件及隐藏文件/optls -l 详细输出文件夹内容 ls -h 输出文件大小(MB...)ls--full-time 完整时间格式输出ls-d 显示文件夹本身信息,不输出内容ls-t 根据最后修改…...
Netty面试题(三)
文章目录 前言一、如何选择序列化协议?二、Netty 的零拷贝实现?总结 前言 如何选择序列化协议?Netty 的零拷贝实现? 一、如何选择序列化协议? 具体场景 对于公司间的系统调用,如果性能要求在 100ms 以上的…...
risc-v dv源代码分析
地址为 GitHub - chipsalliance/riscv-dv: Random instruction generator for RISC-V processor verificationRandom instruction generator for RISC-V processor verification - GitHub - chipsalliance/riscv-dv: Random instruction generator for RISC-V processor verif…...
C语言基础语法复习07-c语言关键字的解释
对前一篇文章写点随笔:https://blog.csdn.net/weixin_43172531/article/details/132893176 基本数据类型(8种)和类型修饰符(4种): void与指针*组合在一起才有具体实体意义。 void本身代表没有类型、没有实体,例如void main(void)。 char c…...
阿里巴巴全店商品采集教程,阿里巴巴店铺所有商品接口(详解阿里巴巴店铺所有商品数据采集步骤方法和代码示例)
随着电商行业的快速发展,阿里巴巴已成为国内的电商平台之一,拥有着海量的商品资源。对于一些需要大量商品数据的商家或者需求方来说,阿里巴巴全店采集是非常必要的。本文将详细介绍阿里巴巴全店采集的步骤和技巧,帮助大家更好地完…...
Android 白天黑夜模式设置
白天黑夜模式是一种动态的UI模式,根据当前时间或用户设置的偏好,在白天和黑夜之间进行切换。它通过调整应用程序的颜色、亮度和其他可视化元素来提供更加舒适和易读的用户界面。 一、简单设置 UiModeManager 是用于管理和控制用户界面模式(UI Mode)。它提供了一组方法,允…...
FFMpeg zoompan 镜头聚焦和移动走位
案例 原始图片 # 输出帧数,默认25帧/秒,25*4 代表4秒 # s1280x80 # 输出视频比例,可以设置和输入图片大小一致 # zoom0.002 表示每帧放大的倍数,下面代码是25帧/每秒 * 4秒,共1000帧 # 最终是 0.002*25*4 0.2&…...
利用hutool工具类实现验证码功能
hutool工具类实现验证码 一.生成验证码二.校验验证码三.使用案例1.引入hutool工具类2.VerifyCodeResp接口响应体3.VerifyCodeController验证码工具类4.测试验证5.项目结构及源码下载 利用hutool工具类,可以很方便生成不同类型的验证码。这里简单记录下使用过程。 一…...
前端面试题: 请解释什么是函数的作用域?
今天做到了一道题:请解释什么是函数的作用域? 我给的答案是: 函数的作用域是指函数执行到内部后创建的数据空间,在函数的作用域内,let定义的变量的有效期为函数作用域 AI觉得我答得比较简单:回答基本正确&…...
华为云云服务器云耀L实例评测 | 华为云云服务器实例新品全面解析
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…...
Nginx配置SSL证书
1 Ubuntu 20.04 上安装 Nginx Nginx 发音 “engine x” ,是一个开源软件,高性能 HTTP 和反向代理服务器,用来在互联网上处理一些大型网站。它可以被用作独立网站服务器,负载均衡,内容缓存和针对 HTTP 和非 HTTP 的反向代理服务器。…...
一,安卓aosp源码编译环境搭建
系列文章目录 第一章 安卓aosp源码编译环境搭建 第二章 手机硬件参数介绍和校验算法 第三章 修改安卓aosp代码更改硬件参数 第四章 编译定制rom并刷机实现硬改(一) 第五章 编译定制rom并刷机实现硬改(二) 第六章 不root不magisk不xposed lsposed frida原生修改定位 第七章 安卓…...
video 视频编解码一些debug方法
文章目录 一、通过命令去获取一些数据1.2 确定我们xml配置文件: 二、查看我们芯片支持的编码能力三、通过log去获取信息 这个文章的主要内容是为了后期性能方面的debug, 设计到前期的bringup则没有 一、通过命令去获取一些数据 获取媒体相关的参数: # getprop |…...
中秋国庆假期——模板推荐
要说最近能让人开心的事情是什么?大概就是下周将迎来8天假,小编帮大家数了数还有11天,就要放中秋国庆的假期了。作为一个资深打工人,本周的日常即将变成:上班想放假、下班想放假、想放假… 但是宝子们要注意,大家在盼…...
【配代码演示】Cookie和Session的区别
一、共同之处: cookie和session都是用来跟踪浏览器用户身份的会话方式。 二、工作原理: 1.Cookie的工作原理 (1)浏览器端第一次发送请求到服务器端 (2)服务器端创建Cookie,该Cookie中包含用户的…...
【Linux初阶】信号入门2 | 信号阻塞、捕捉、保存
文章目录 ☀️前言☀️一、信号阻塞🌻1.信号其他相关常见概念🌻2.信号在内核中的表示 ☀️二、信号捕捉(重点)🌻1.用户态 & 内核态🌻2.如何判断进程处于用户态或内核态🌻3.OS接口的访问方法…...
【已解决】:该该虚拟机似乎正在使用中。如果该虚拟机未在使用,请按“获取所有权(T)“按钮获取它的所有权。否则,请按“取消(C)“按钮以防损坏。
现象 启动VMware虚拟机,无法正常打开并出现以下信息: 原因 这是因为当运行一个“虚拟系统”时,为防止该系统被另外一个VMware程序打开,导致数据被修改或损坏,VMware会自动在该“虚拟系统”所在的文件夹下,…...
系统架构常用的工具
HBase HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样ÿ…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
