网络编程—Socket套接字(UDP)
上篇文章:
网络编程—网络概念
https://blog.csdn.net/sniper_fandc/article/details/146923380?fromshare=blogdetail&sharetype=blogdetail&sharerId=146923380&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link
目录
1 概念
2 Socket套接字
3 UDP数据报套接字
1 概念
(1)网络编程:指网络上的主机,通过不同的进程,以编程的方式实现网络通信(网络数据传输)。
进程具有隔离性,因此不同的进程间要通信就得通过共享的公共区域来交换数据,网卡即是一种共享公共区域。
(2)客户端(Client)/服务器(Server):客户端是数据发送方,服务器是数据接收方,由于服务器是被动接收数据,不知道客户端什么时候发送数据,因此服务器经常是24小时运行。
(3)请求(request)和响应(response):客户端发送给服务器的数据,服务器返回给客户端的数据。
(4)客户端/服务器交互方式:一问一答(浏览网页)、多问一答(上传文件)、一问多答(下载文件)和多问多答(远程控制、游戏串流(手机连接电脑玩电脑游戏))。
2 Socket套接字
Socket即是传输层(操作系统)提供给程序员的API,有基于TCP和UDP两种类型,原始的API是C语言的,经过JVM包装后,形成了Java的Socket API。
3 UDP数据报套接字
基于UDP的Socket主要是DatagramSocket,用于发送和接收UDP数据报,作用和操作方式都类似文件(打开Socket文件(对应网卡),发送/接收数据报,关闭文件)。
| 构造方法/方法 | 含义 |
| DatagramSocket() | 构造方法,创建一个UDP数据报套接字的Socket,绑定到本机任意一个随机端口(一般用于客户端) |
| DatagramSocket(int port) | 构造方法,创建一个UDP数据报套接字的Socket,绑定到本机指定的端口(一般用于服务端) |
| void receive(DatagramPacket p) | 从套接字接收数据报(如果没有接收到数据报,该方法会阻塞等待) |
| void send(DatagramPacket p) | 从套接字发送数据报包(不会阻塞等待,直接发送) |
| void close() | 关闭数据报套接字 |
DatagramPacket是数据报的API,用来组织需要发送和接收的数据。
| 构造方法/方法 | 含义 |
| DatagramPacket(byte[] buf, int length) | 构造方法,创建一个DatagramPacket用来接收数据报,接收的数据保存在buf,length是数据长度 |
| DatagramPacket(byte[] buf, int offset, int length, SocketAddress address | 构造方法,创建一个DatagramPacket用来发送数据报,发送的数据保存在buf,offset是起始下标,length是数据长度,address指定目标主机的IP和端口号 |
| InetAddress getAddress() | 从接收的数据报中,获取发送端主机IP地址,或从发送的数据报中,获取接收端主机IP地址 |
| int getPort() | 从接收的数据报中,获取发送端主机的端口号,或从发送的数据报中,获 取接收端主机端口号 |
| byte[] getData() | 获取数据报中的数据 |
而使用InetSocketAddress(InetAddress addr, int port)即可创建一个Socket地址,包含IP地址和端口号,它是SocketAddress的子类。
下面利用UDP数据报套接字实现一个回显服务器,回显服务器是指客户端发送什么,服务器就返回什么。
public class UdpServer {//回显服务器端口号private final int PORT = 8000;public DatagramSocket datagramSocket = null;//通过端口创建udp服务器(本质是打开一个socket文件)public UdpServer() throws SocketException {datagramSocket = new DatagramSocket(PORT);}//启动服务器public void start() throws IOException {System.out.println("服务器已启动");//服务器需要24小时启动因此写成死循环while(true){//1.创建接收请求的数据报(分配字节数组空间)并接收请求DatagramPacket datagramPacket = new DatagramPacket(new byte[4096],4096);//该方法会一直阻塞等待直到客户端发送请求datagramSocket.receive(datagramPacket);//2.解析请求构造响应数据报String request = new String(datagramPacket.getData(),0,datagramPacket.getLength());//3.根据请求构造响应(服务器业务逻辑)String response = process(request);//要用指定发送地址的构造方法(发送地址可以从接收的请求数据报中获取)DatagramPacket datagramPacketResponse = new DatagramPacket(response.getBytes(),response.getBytes().length,datagramPacket.getSocketAddress());//4.返回响应datagramSocket.send(datagramPacketResponse);System.out.printf("[%s:%d] request=%s;response=%s\n",datagramPacket.getAddress().toString(),datagramPacket.getPort(),request,response);}}//回显服务器就是发送什么请求返回什么响应private String process(String request) {return request;}public static void main(String[] args) throws IOException {//启动服务器UdpServer server = new UdpServer();server.start();}}public class UdpClient {//创建客户端private DatagramSocket socket = null;public UdpClient() throws SocketException {//客户端一般随机生成端口号socket = new DatagramSocket();}//启动客户端public void start() throws IOException {Scanner scanner = new Scanner(System.in);while(true){//1.构造请求System.out.print(">");String req = scanner.next();//构造的请求数据报既要包含数据又要包含地址(IP+端口)DatagramPacket request = new DatagramPacket(req.getBytes(),req.getBytes().length,InetAddress.getByName("127.0.0.1"),8000);//2.发送请求socket.send(request);//3.接受响应并解析响应DatagramPacket response = new DatagramPacket(new byte[4096],4096);socket.receive(response);String resp = new String(response.getData(),0,response.getLength());//4.将响应返回给用户System.out.printf("request=%s,response=%s\n",req,resp);}}public static void main(String[] args) throws IOException {UdpClient udpClient = new UdpClient();udpClient.start();}}
在服务器代码中,需要注意response.getBytes().length不等于response.length(),前一个方法获取的是字节长度,而后一个方法获取的是字符长度,当字符中有中文时,字节长度和字符长度并不相等,因此不能替换。而字符串“127.0.0.1”是环回IP,表示本机(自己发给自己)。


根据结果显示,虽然发送的一条请求hello World,但是却被拆成hello和World两条请求发送了,这是因为这里使用Scanner类的next()方法,该方法以空格作为结束进行分割,因此发送两条请求。如果向发送一条,就可以使用nextLine(),该方法以换行符结束。
下篇文章:
网络编程—Socket套接字(TCP)
https://blog.csdn.net/sniper_fandc/article/details/146923783?fromshare=blogdetail&sharetype=blogdetail&sharerId=146923783&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link
相关文章:
网络编程—Socket套接字(UDP)
上篇文章: 网络编程—网络概念https://blog.csdn.net/sniper_fandc/article/details/146923380?fromshareblogdetail&sharetypeblogdetail&sharerId146923380&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link 目录 1 概念 2 Soc…...
视频设备轨迹回放平台EasyCVR综合智能化,搭建运动场体育赛事直播方案
一、背景 随着5G技术的发展,体育赛事直播迎来了新的高峰。无论是NBA、西甲、英超、德甲、意甲、中超还是CBA等热门赛事,都是值得记录和回放的精彩瞬间。对于体育迷来说,选择观看的平台众多,但是作为运营者,搭建一套体…...
AIGC实战——CycleGAN详解与实现
AIGC实战——CycleGAN详解与实现 0. 前言1. CycleGAN 基本原理2. CycleGAN 模型分析3. 实现 CycleGAN小结系列链接 0. 前言 CycleGAN 是一种用于图像转换的生成对抗网络(Generative Adversarial Network, GAN),可以在不需要配对数据的情况下将一种风格的图像转换成…...
VS2022远程调试Linux程序
一、 1、VS2022安装参考 VS Studio2022安装教程(保姆级教程)_visual studio 2022-CSDN博客 注意:勾选的时候,要勾选下方的选项,才能调试Linux环境下运行的程序! 2、VS2022远程调试Linux程序测试 原文参…...
345-java人事档案管理系统的设计与实现
345-java人事档案管理系统的设计与实现 项目概述 本项目为基于Java语言的人事档案管理系统,旨在帮助企事业单位高效管理员工档案信息,实现档案的电子化、自动化管理。系统涵盖了员工信息的录入、查询、修改、删除等功能,同时具备权限控制和…...
【Linux系统编程】进程概念,进程状态
目录 一,操作系统(Operator System) 1-1概念 1-2设计操作系统的目的 1-3核心功能 1-4系统调用和库函数概念 二,进程(Process) 2-1进程概念与基本操作 2-2task_struct结构体内容 2-3查看进程 2-4通…...
优选算法的妙思之流:分治——快排专题
专栏:算法的魔法世界 个人主页:手握风云 目录 一、快速排序 二、例题讲解 2.1. 颜色分类 2.2. 排序数组 2.3. 数组中的第K个最大元素 2.4. 库存管理 III 一、快速排序 分治,简单理解为“分而治之”,将一个大问题划分为若干个…...
# 实时人脸识别系统:基于 OpenCV 和 Python 的实现
实时人脸识别系统:基于 OpenCV 和 Python 的实现 在当今数字化时代,人脸识别技术已经广泛应用于各种场景,从手机解锁到安防监控,再到智能门禁系统。今天,我将通过一个完整的代码示例,详细讲解如何使用 Pyt…...
Mysql 中 ACID 背后的原理
在 MySQL 中,ACID 是事务处理的核心原则,用于保证数据库在执行事务时的可靠性、数据一致性和稳定性。ACID 是四个关键特性的首字母缩写,分别是:Atomicity(原子性)、Consistency(一致性ÿ…...
wx206基于ssm+vue+uniapp的优购电商小程序
开发语言:Java框架:ssmuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:M…...
React编程高级主题:错误处理(Error Handling)
文章目录 **5.2 错误处理(Error Handling)概述****5.2.1 onErrorReturn / onErrorResume(错误回退)****1. onErrorReturn:提供默认值****2. onErrorResume:切换备用数据流** **5.2.2 retry / retryWhen&…...
ubuntu20.04升级成ubuntu22.04
命令行 sudo do-release-upgrade 我是按提示输入y确认操作,也可以遇到配置文件冲突时建议选择N保留当前配置...
SpringCloud(25)——Stream介绍
1.场景描述 当我们的分布式系统建设到一定程度了,或者服务间是通过异步请求来通讯的,那么我们避免不了使用MQ来解决问题。 假如公司内部进行了业务合并或者整合,需要服务A和服务B通过MQ的方式进行消息传递,而服务A用的是RabbitMQ&…...
OrangePi5Plus开发板不能正确识别USB 3.0 设备 (绿联HUB和Camera)
1、先插好上电(可正确识别) 2、上电开机后插入USB 3.0 设备,报错如下,只能检测到USB2.0--480M,识别不到USB3.0-5Gbps,重新插拔也不行 Apr 4 21:30:00 orangepi5plus kernel: [ 423.575966] usb 5-1: re…...
centos8上实现lvs集群负载均衡dr模式
1.前言 个人备忘笔记,欢迎探讨。 centos8上实现lvs集群负载均衡nat模式 centos8上实现lvs集群负载均衡dr模式 之前写过一篇lvs-nat模式。实验起来相对顺利。dr模式最大特点是响应报文不经调度器,而是直接返回客户机。 dr模式分同网段和不同网段。同…...
uniapp如何接入星火大模型
写在前面:最近的ai是真的火啊,琢磨了一下,弄个uniappx的版本开发个东西玩一下,想了想不知道放啥内容,突然觉得deepseek可以接入,好家伙,一对接以后发现这是个付费的玩意,我穷&#x…...
三、FFmpeg学习笔记
FFmpeg是一个开源、跨平台的多媒体处理框架,能够实现音视频的录制、转换、剪辑、编码、解码、流媒体传输、过滤与后期处理等几乎所有常见的多媒体操作。其强大之处在于几乎支持所有的音视频格式、编解码器和封装格式,是业界公认的“瑞士军刀”。 FFmp…...
Linux常用基础命令应用
目录 一、文件与目录操作(12个核心命令) 1. pwd - 显示当前路径 2. ls - 查看目录内容 3. cd - 切换目录 4. mkdir - 创建目录 5. touch - 创建文件 6. cp - 复制文件/目录 7. mv - 移动…...
【python中级】关于Cython 的源代码pyx的说明
【python中级】关于Cython 的源代码pyx的说明 1.背景2.编译3.语法1.背景 Cython 是一个编程语言和工具链,用于将 Python 代码(或类 Python 的代码)编译成 C 语言,再进一步生成高性能的 Python 扩展模块(.so 或 .pyd 文件)。 在 Python 中,.pyx 文件是 Cython 的源代码文…...
第十八节课:Python编程基础复习
课程复习 前三周核心内容回顾 第一周:Python基本语法元素 基础语法:缩进、注释、变量命名、保留字数据类型:字符串、整数、浮点数、列表程序结构:赋值语句、分支语句(if)、函数输入输出:inpu…...
MySQL vs MSSQL 对比
在企业数据库管理系统中,MySQL 和 Microsoft SQL Server(MSSQL)是最受欢迎的两大选择。MySQL 是一款开源的关系型数据库管理系统(RDBMS),由 MySQL AB 开发,现归属于 Oracle 公司。而 MSSQL 是微…...
解决LeetCode“使括号有效的最少添加”问题
目录 问题描述 解题思路 复杂度分析 示例分析 暴力替换“不讲码德” 总结 问题描述 给定一个仅由 ( 和 ) 组成的字符串 s,我们需要通过添加最少数量的括号(( 或 ))使得字符串有效。有效字符串需满足: 空字符串是有效的。 …...
python基础-10-组织文件
文章目录 【README】【10】组织文件(复制移动删除重命名)【10.1】shutil模块(shell工具)【10.1.1】复制文件和文件夹【10.1.1.1】复制文件夹及其下文件-shutil.copytree 【10.1.2】文件和文件夹的移动与重命名【10.1.3】永久删除文件和文件夹【10.1.4】用…...
ORA-09925 No space left on device 问题处理全过程记录
本篇文章关键字:linux、oracle、审计、ORA-09925 一、故障现像 朋友找到我说是他们备份软件上报错。 问题比较明显,ORA-09925,看起来就是空间不足导致的 二、问题分析过程 这里说一下逐步的分析思路,有个意外提前说一下就是我…...
多输入多输出 | Matlab实现BO-GRU贝叶斯优化门控循环单元多输入多输出预测
多输入多输出 | Matlab实现BO-GRU贝叶斯优化门控循环单元多输入多输出预测 目录 多输入多输出 | Matlab实现BO-GRU贝叶斯优化门控循环单元多输入多输出预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现BO-GRU贝叶斯优化门控循环单元多输入多输出预测&#…...
27信号和槽_自定义信号(2)
自定义信号和槽 绑定信号和槽 如何才能触发出自定义的信号呢?(上诉代码只是将信号和槽绑定在一起,但并没有触发信号) Qt 内置的信号,都不需要咱们手动通过代码来触发 用户在 GUI, 进行某些操作,就会自动触发对应信号.(发射信号的代码已经内置…...
人工智能在生物医药领域的应用地图:AIBC2025将于6月在上海召开!
人工智能在生物医药领域的应用地图:AIBC2025将于6月在上海召开! 近年来,人工智能在生物医药行业中的应用受到广泛关注。 2024年10月,2024诺贝尔化学奖被授予“计算蛋白质设计和蛋白质结构预测”,这为行业从业人员带来…...
2025.3.19
1、用vim编辑/etc/hosts文件,将本机和第二个虚拟机的ip地址和主机名写入该文件,然后ping 两个主机的主机名能否ping通; (1)在第一个虚拟机编辑/etc/hosts: 首先使用hostname、hostnamectl、hostname -f指令查看主机名…...
深度学习 Deep Learning 第16章 结构化概率模型
深度学习 Deep Learning 第16章 结构化概率模型 内容概要 本章深入探讨了结构化概率模型(Graphical Models,包含有向图和无向图模型)的概念及其在深度学习中的应用。结构化概率模型通过图结构描述随机变量之间的直接交互,从而简…...
HTML5 vs HTML 和 CSS3 vs CSS:全面对比
HTML5 与 HTML HTML 概述 HTML (HyperText Markup Language) 是构建网页的标准标记语言。HTML 经历了多个版本的发展: HTML 2.0 (1995年):最早的标准化版本 HTML 4.01 (1999年):增加了样式表支持 XHTML (2000年):基于XML的更严…...
