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搜索 在当今数字化时代,地图应用已成为移动设备中不可或缺的一部分。随着鸿蒙系统的日益普及,如何在鸿蒙应用中…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
Modbus RTU与Modbus TCP详解指南
目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...
基于Java项目的Karate API测试
Karate 实现了可以只编写Feature 文件进行测试,但是对于熟悉Java语言的开发或是测试人员,可以通过编程方式集成 Karate 丰富的自动化和数据断言功能。 本篇快速介绍在Java Maven项目中编写和运行测试的示例。 创建Maven项目 最简单的创建项目的方式就是创建一个目录,里面…...
智能体革命:企业如何构建自主决策的AI代理?
OpenAI智能代理构建实用指南详解 随着大型语言模型(LLM)在推理、多模态理解和工具调用能力上的进步,智能代理(Agents)成为自动化领域的新突破。与传统软件仅帮助用户自动化流程不同,智能代理能够自主执行工…...
