Java【网络原理】(2)初识网络续与网络编程

目录
1.前言
2.正文
2.1TCP协议与UDP协议
2.2socket API进行网络编程
2.2.1DatagramPacket类
2.2.1.1发送数据报
2.2.1.2接收数据报
2.2.1.3获取数据报内容
2.2.1.4设置数据报内容
2.2.2DatagramSocket类
2.2.2.1构造方法
2.2.2.2常用方法
2.2.3具体代码与解释
3.小结
1.前言
哈喽大家好吖,今天继续给大家分享计算机网络相关的知识,先讲解传输层两个重要的UDP和TCP协议,再讲解在UDP中通过socket API来进行网络编程。
2.正文
2.1TCP协议与UDP协议
在讲解二者的概念与对比之前,先提前介绍几个涉及到的概念:
有连接/无连接:指的是通信的A和B两端是否互相保留对方的信息(即彼此之间是否知道是谁和它建立连接)。
可靠传输/不可靠传输:在网络上,很容易出现丢包这种情况,因为光信号和电信号都可能受到外界干扰,如果在传输中识别到某些出错的数据,打包丢掉,保证正常数据传输,这个叫做可靠传输,反之只管发送,不管中间的错误就是不可靠传输。
面向字节流/面向数据包:面向字节流,读写数据的时候,是以字节为单位面向数据报,读写数据的时候,以一个数据报为单位(不是字符)。
全双工/半双工:一个通信链路,支持双向通信(能读,也能写) / 一个通信链路,只支持单向通信~~(要么读,要么写)
讲解完以上概念,正文就可以顺利开始~
TCP(传输控制协议)和UDP(用户数据报协议)是互联网中最重要的两种传输层协议,负责在应用程序之间传输数据。它们在设计目标、工作原理和应用场景上有显著差异。以下是详细的对比和解析:
TCP
特点:
面向连接:通信前需通过三次握手建立可靠连接,结束时通过四次挥手释放连接。
可靠传输:通过确认应答(ACK)、超时重传、数据排序、流量控制和拥塞控制确保数据完整、有序、无丢失。
全双工通信:支持双向数据流传输。
字节流模式:数据被看作无结构的字节流,由TCP自行分割和重组。
优点:
数据可靠性高,适合文件传输、网页浏览等场景。
自动处理数据分片、重组和错误恢复。
缺点:
建立和释放连接的开销大。
传输延迟较高。
UDP
特点:
无连接:直接发送数据,无需建立连接。
不可靠传输:不保证数据到达、顺序或完整性。
数据报模式:每个数据包独立处理,保留边界。
全双工通信:支持双向数据流传输。
优点:
传输速度快、延迟低。
资源占用少,适合实时性要求高的场景。
支持广播和多播(一对多通信)。
缺点:
不保证数据可靠性,可能丢失或乱序。
2.2socket API进行网络编程
接下来,就到了咱们的代码环节了,我们将利用socket API来创建一个本地的UDP回显服务器。那么何为回显服务器呢?
UDP回显服务器是一种简单的网络服务,它接收客户端发送的UDP数据报,并将相同的数据报原样返回给客户端,即请求和响应相同。
2.2.1DatagramPacket类
在开始创建一个本地的UDP回显服务器之前,需要先介绍一下我们要使用的DatagramPacket类:
DatagramPacket类用于封装UDP数据报。它表示一个UDP数据报的结构,包括数据内容、目标地址、目标端口、数据长度等信息。
2.2.1.1发送数据报
DatagramPacket(byte[] buf, int length, InetAddress address, int port)
buf:要发送的数据,存储在字节数组中。
length:要发送的数据的长度。
address:目标主机的 IP 地址,类型为InetAddress。
port:目标主机的端口号。
2.2.1.2接收数据报
DatagramPacket(byte[] buf, int length)
buf:用于存储接收到的数据的字节数组。
length:字节数组的长度,即最大可接收的数据长度。
2.2.1.3获取数据报内容
getData():返回数据报的数据,类型为byte[]。
getLength():返回数据报的实际数据长度。
getAddress():返回发送方的 IP 地址(接收时使用)。
getPort():返回发送方的端口号(接收时使用)。
2.2.1.4设置数据报内容
setData(byte[] buf):设置数据报的数据。
setLength(int length):设置数据报的长度。
setAddress(InetAddress address):设置目标地址。
setPort(int port):设置目标端口。
2.2.2DatagramSocket类
DatagramSocket类用于发送和接收UDP数据报。它表示一个UDP端点,可以绑定到本地端口,并通过网络发送和接收数据报。
2.2.2.1构造方法
- DatagramSocket():系统随机分配一个未使用的本地端口。
- DatagramSocket(int port):绑定指定的本地端口。
- DatagramSocket(int port, InetAddress address):绑定到指定的本地端口和地址。
2.2.2.2常用方法
- void send(DatagramPacket p):发送数据报。
- void receive(DatagramPacket p):接收数据报。
- void close():关闭套接字。
2.2.3具体代码与解释
下面是具有详细的注释的代码与讲解:
UdpEchoServer:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;public class UdpEchoServer {private DatagramSocket socket = null;public UdpEchoServer(int port) throws SocketException {// 指定了一个固定端口号, 让服务器来使用.socket = new DatagramSocket(port);}public void start() throws IOException {// 启动服务器System.out.println("服务器启动");while (true) {// 循环一次, 就相当于处理一次请求.// 处理请求的过程, 典型的服务器都是分成三个步骤的.// 1. 读取请求并解析.// DatagramPacket 表示一个 UDP 数据报. 此处传入的字节数组, 就保存 UDP 的载荷部分.DatagramPacket requestPacket = new DatagramPacket(new byte[4096], 4096);socket.receive(requestPacket);// 把读取到的二进制数据, 转成字符串. 只是构造有效的部分.String request = new String(requestPacket.getData(), 0, requestPacket.getLength());// 2. 根据请求, 计算响应. (服务器最关键的逻辑)// 但是此处写的是回显服务器. 这个环节相当于省略了.String response = process(request);// 3. 把响应返回给客户端// 根据 response 构造 DatagramPacket, 发送给客户端.// 此处不能使用 response.length()DatagramPacket responsePacket = new DatagramPacket(response.getBytes(), response.getBytes().length,requestPacket.getSocketAddress());// 此处还不能直接发送. UDP 协议自身没有保存对方的信息(不知道发给谁)// 需要指定 目的 ip 和 目的端口.socket.send(responsePacket);// 4. 打印一个日志System.out.printf("[%s:%d] req: %s, resp: %s\n", requestPacket.getAddress().toString(), requestPacket.getPort(),request, response);}}// 后续如果要写别的服务器, 只修改这个地方就好了.// 不要忘记, private 方法不能被重写. 需要改成 publicpublic String process(String request) {return request;}public static void main(String[] args) throws IOException {UdpEchoServer server = new UdpEchoServer(9090);server.start();}
}
UdpEchoClient:
import java.io.IOException;
import java.net.*;
import java.util.Scanner;public class UdpEchoClient {private DatagramSocket socket = null;// UDP 本身不保存对端的信息, 就自己的代码中保存一下private String serverIp;private int serverPort;// 和服务器不同, 此处的构造方法是要指定访问的服务器的地址.public UdpEchoClient(String serverIp, int serverPort) throws SocketException {this.serverIp = serverIp;this.serverPort = serverPort;socket = new DatagramSocket();}public void start() throws IOException {Scanner scanner = new Scanner(System.in);while (true) {// 1. 从控制台读取用户输入的内容.System.out.println("请输入要发送的内容:");if (!scanner.hasNext()) {break;}String request = scanner.next();// 2. 把请求发送给服务器, 需要构造 DatagramPacket 对象.// 构造过程中, 不光要构造载荷, 还要设置服务器的 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[4096], 4096);socket.receive(responsePacket);// 5. 从服务器读取的数据进行解析, 打印出来.String response = new String(responsePacket.getData(), 0, responsePacket.getLength());System.out.println(response);}}public static void main(String[] args) throws IOException {UdpEchoClient client = new UdpEchoClient("127.0.0.1", 9090);client.start();}
}

实现核心思路:
服务器端:
打开一个UDP套接字(Socket)。
绑定到一个指定的端口,等待客户端发送数据。
接收客户端发送的UDP数据报。
将接收到的数据报原样发送回客户端。
重复上述过程,直到服务器关闭。
客户端:
打开一个UDP套接字。
向服务器的指定端口发送数据报。
接收服务器返回的数据报。
比较发送和接收的数据是否一致,以验证数据传输的完整性。
关闭套接字。
3.小结
今天的分享到这里就结束了,喜欢的小伙伴不要忘记点点赞点个关注,你的鼓励就是对我最大的支持,加油!
相关文章:
Java【网络原理】(2)初识网络续与网络编程
目录 1.前言 2.正文 2.1TCP协议与UDP协议 2.2socket API进行网络编程 2.2.1DatagramPacket类 2.2.1.1发送数据报 2.2.1.2接收数据报 2.2.1.3获取数据报内容 2.2.1.4设置数据报内容 2.2.2DatagramSocket类 2.2.2.1构造方法 2.2.2.2常用方法 2.2.3具体代码与解释 3…...
AI+集装箱号码识别技术,主要发展方向和应用潜力
集装箱号码识别技术作为物流数字化的重要工具,其应用前景随着全球供应链的智能化升级和绿色转型需求不断扩大。结合当前技术发展和行业实践,以下是其未来的主要发展方向和应用潜力: 1.物流与港口智能化管理 自动化识别与效率提升࿱…...
安装可视化jar包部署平台JarManage
一、下载 下载地址:JarManage 发行版 - Gitee.com 🚒 下载 最新发行版 下载zip的里面linux和windows版本都有 二、运行 上传到服务器,解压进入目录 🚚 执行java -jar jarmanage-depoly.jar 命令运行 java -jar jarmanage-dep…...
后端之JPA(EntityGraph+JsonView)
不同表之间的级联操作或者说关联查询是很多业务场景都会用到的。 对于这种需求最朴素的方法自然是手动写关联表,然后对被关联的表也是手动插入数据。但是手写容易最后写成一堆shit代码,而且修改起来也是非常麻烦的。 学会使用现成的工具还是非常有利的…...
Java数据结构第十三期:走进二叉树的奇妙世界(二)
专栏:数据结构(Java版) 个人主页:手握风云 目录 一、二叉树的遍历 1.1. 前序遍历 1.2. 中序遍历 1.3. 后序遍历 1.4. 完整代码 二、二叉树的基本操作 2.1. 获取树中结点个数 2.1. 获取叶子结点个数 2.3. 获取第k层结点的个数 2.4. 获取二叉树的…...
JavaScript系列(86)--现代构建工具详解
JavaScript 现代构建工具详解 🔨 现代前端开发离不开构建工具,它们帮助我们处理模块打包、代码转换、资源优化等任务。让我们深入了解主流的构建工具及其应用。 构建工具概述 🌟 💡 小知识:构建工具主要解决代码转换…...
docker容器网络配置及常用操作
Linux内核实现名称空间的创建 ip netns(网络名称空间)命令 可以借助ip netns命令来完成对 Network Namespace 的各种操作。ip netns命令来自于iproute安装包,一般系统会默认安装,如果没有的话,请自行安装。 注意&am…...
Docker 性能优化指南
Docker 提供了强大的容器化功能,能够帮助开发者在不同的环境中构建、测试和部署应用。然而,随着容器化应用的不断增长,Docker 容器可能会面临一些性能瓶颈,影响其运行效率、资源占用和扩展能力。为了确保容器在生产环境中的高效运…...
课程1. 深度学习简介
课程1. 深度学习简介 神经网络结构逻辑回归XOR问题(异或问题) 中间特征的生成全连接神经网络中间网络层的激活函数Sigmoid函数Tanh函数ReLU函数其它激活函数 使用全连接神经网络解决 XOR 问题神经网络用于回归问题训练神经网络 不同类型的神经网络 附加材…...
【cuda学习日记】4.3 结构体数组与数组结构体
4.3 数组结构体(AoS)和结构体数组(SoA) AoS方法进行存储 struct innerStruct{float x;float y; };struct innerStruct myAOS[N];SoA方法来存储数据 struct innerArray{float x[N];float y[N]; };struct innerArray moa;如图说明…...
2025最新高维多目标优化:基于城市场景下无人机三维路径规划的导航变量的多目标粒子群优化算法(NMOPSO),MATLAB代码
一、基于导航变量的多目标粒子群优化算法(NMOPSO)介绍 基于导航变量的多目标粒子群优化算法(Navigation variable-based multi-objective particle swarm optimization,NMOPSO)是2025年提出的一种用于无人机路径规划的…...
数字IC后端设计实现OCC(On-chip Clock Controller)电路介绍及时钟树综合案例
数字IC后端时钟树综合专题(OCC电路案例分享) 复杂时钟设计时钟树综合(clock tree synthesis)常见20个典型案例 1、什么是OCC? 片上时钟控制器(On-chip Clock Controllers ,OCC),也称为扫描时钟控制器(Scan Clock Con…...
Linux内核,slub分配流程
我们根据上面的流程图,依次看下slub是如何分配的 首先从kmem_cache_cpu中分配,如果没有则从kmem_cache_cpu的partial链表分配,如果还没有则从kmem_cache_node中分配,如果kmem_cache_node中也没有,则需要向伙伴系统申请…...
本地部署DeepSeek-R1(Ollama+Docker+OpenWebUI知识库)
安装Ollama 打开 Ollama官网 https://ollama.com/下载安装 Ollama服务默认只允许本机访问,修改允许其它主机访问 OLLAMA_HOST0.0.0.0 ollama serve也可以添加系统环境变量 都知道模型体积很大,顺便也通过环境变量修改模型存放位置,我这…...
Java 实现快速排序算法:一条快速通道,分而治之
大家好,今天我们来聊聊快速排序(QuickSort)算法,这个经典的排序算法被广泛应用于各种需要高效排序的场景。作为一种分治法(Divide and Conquer)算法,快速排序的效率在平均情况下非常高ÿ…...
20250223下载并制作RTX2080Ti显卡的显存的测试工具mats
20250223下载并制作RTX2080Ti显卡的显存的测试工具mats 2025/2/23 23:23 缘起:我使用X99的主板,使用二手的RTX2080Ti显卡【显存22GB版本,准备学习AI的】 但是半年后发现看大码率的视频容易花屏,最初以为是WIN10经常更换显卡/来回更…...
element-ui的组件使用
1. 安装 Element UI(在文件夹最上面输入cmd进入dos窗口,然后输入安装指令 npm install element-ui --save) 2.在main.js文件全局引入(main.js文件负责 全局注册 ),在该文件注册的所有组件在其他文件都能直接调用,一般…...
医疗AI领域中GPU集群训练的关键技术与实践经验探究(上)
医疗AI领域中GPU集群训练的关键技术与实践经验探究(上) 一、引言 1.1 研究背景与意义 在科技飞速发展的当下,医疗 AI 作为人工智能技术与医疗领域深度融合的产物,正引领着医疗行业的深刻变革。近年来,医疗 AI 在疾病诊断、药物研发、健康管理等诸多方面取得了显著进展,…...
详解Redis淘汰策略
引言 Redis 是一个高性能的内存数据库,广泛应用于缓存系统、消息队列等场景。当 Redis 的内存达到限制时,需要根据一定的策略来淘汰数据,以便腾出空间给新数据。本文将深入解析 Redis 的内存淘汰机制,帮助更好地配置 Redis&#…...
HarmonyOS 5.0应用开发——鸿蒙接入高德地图实现POI搜索
【高心星出品】 文章目录 鸿蒙接入高德地图实现POI搜索运行结果:准备地图编写ArkUI布局来加载HTML地图 鸿蒙接入高德地图实现POI搜索 在当今数字化时代,地图应用已成为移动设备中不可或缺的一部分。随着鸿蒙系统的日益普及,如何在鸿蒙应用中…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...
