06 网络编程基础
目录
1.通信三要素
1. IP地址(Internet Protocol Address)
2. 端口号(Port Number)
3. 协议(Protocol)
2.TCP与UDP协议
三次握手(Three-Way Handshake)
四次挥手(Four-Way Waveoff)
TCP协议编程示例
UDP协议编程示例
1.通信三要素
在网络编程中,通信的三个基本要素是:IP地址、端口号和协议。这三个要素共同确定了一个网络连接的唯一性。下面是对这三个要素的详细解释:
1. IP地址(Internet Protocol Address)
IP地址是互联网协议(Internet Protocol)地址,用于标识网络上的设备。IP地址分为两种主要类型:
-
IPv4:32位地址,通常表示为四个十进制数,每个数之间用点号分隔,例如
192.168.1.1
。 -
IPv6:128位地址,通常表示为八组十六进制数,每组之间用冒号分隔,例如
2001:0db8:85a3:0000:0000:8a2e:0370:7334
。
2. 端口号(Port Number)
端口号是一个16位的数字,用于标识特定的应用程序或服务。端口号范围从0到65535,其中:
-
0-1023
:熟知端口(Well-Known Ports),这些端口号由IANA(Internet Assigned Numbers Authority)分配给特定的服务,例如:
-
HTTP:80
-
HTTPS:443
-
FTP:21
-
SSH:22
-
-
1024-49151:注册端口(Registered Ports),这些端口号可以由用户和应用程序注册使用。
-
49152-65535:动态或私有端口(Dynamic or Private Ports),这些端口号通常由操作系统动态分配给客户端应用程序。
3. 协议(Protocol)
协议定义了数据在网络上传输的方式和格式。常见的网络协议包括:
-
TCP(Transmission Control Protocol):一种面向连接的、可靠的传输协议,用于保证数据的完整性和顺序。TCP通过三次握手建立连接,通过四次挥手断开连接。
-
UDP(User Datagram Protocol):一种无连接的、不可靠的传输协议,适用于实时应用,如视频流和在线游戏。
-
HTTP(Hypertext Transfer Protocol):用于传输超文本的协议,通常在浏览器和Web服务器之间使用。
-
HTTPS(Hypertext Transfer Protocol Secure):HTTP的加密版本,使用SSL/TLS协议进行数据加密。
2.TCP与UDP协议
在网络通信中,TCP(传输控制协议)是一种面向连接的、可靠的传输协议。TCP连接的建立和断开分别通过三次握手和四次挥手来完成。
三次握手(Three-Way Handshake)
三次握手是TCP连接建立的过程,确保双方都准备好进行数据传输。以下是三次握手的步骤:
-
第一次握手:
-
客户端发送一个SYN(同步序列编号)包到服务器,并进入SYN_SEND状态,等待服务器确认。
-
SYN包中包含客户端的初始序列号(ISN),记为
Seq=A
。
-
-
第二次握手:
-
服务器收到客户端的SYN包后,回复一个SYN+ACK(同步确认)包,表示接受连接请求。
-
SYN+ACK包中包含服务器的初始序列号
Seq=B
,以及对客户端SYN包的确认号Ack=A+1
。 -
服务器进入SYN_RECV状态。
-
-
第三次握手:
-
客户端收到服务器的SYN+ACK包后,发送一个ACK(确认)包,确认收到服务器的SYN+ACK包。
-
ACK包中包含对服务器SYN包的确认号
Ack=B+1
,以及自己的序列号Seq=A+1
。 -
客户端进入ESTABLISHED状态。
-
服务器收到客户端的ACK包后,也进入ESTABLISHED状态,连接建立完成。
-
四次挥手(Four-Way Waveoff)
四次挥手是TCP连接断开的过程,确保双方都正确地关闭连接。以下是四次挥手的步骤:
-
第一次挥手:
-
客户端发送一个FIN(结束)包到服务器,表示客户端已经没有数据要发送了。
-
客户端进入FIN_WAIT_1状态。
-
-
第二次挥手:
-
服务器收到客户端的FIN包后,发送一个ACK(确认)包,确认收到客户端的FIN包。
-
ACK包中包含对客户端FIN包的确认号
Ack=A+1
,以及自己的序列号Seq=B
。 -
服务器进入CLOSE_WAIT状态,客户端进入FIN_WAIT_2状态。
-
-
第三次挥手:
-
服务器发送一个FIN包到客户端,表示服务器也没有数据要发送了。
-
服务器进入LAST_ACK状态。
-
-
第四次挥手:
-
客户端收到服务器的FIN包后,发送一个ACK包,确认收到服务器的FIN包。
-
ACK包中包含对服务器FIN包的确认号
Ack=B+1
,以及自己的序列号Seq=A+1
。 -
客户端进入TIME_WAIT状态,等待2MSL(最大段生命周期)后完全关闭连接。
-
服务器收到客户端的ACK包后,进入CLOSED状态,连接完全关闭。
-
TCP协议编程示例
客户端
public class SocketClient {public static void main(String[] args) throws IOException {// 创建socketdu对象,指明服务器地址和端口Socket socket = new Socket("localhost", 9999);System.out.println("连接成功!"); // 向服务器发送数据OutputStream outputStream = socket.getOutputStream();outputStream.write("Hello, 经验宝宝!".getBytes());System.out.println("数据发送成功!"); //给服务端写一个结束标记socket.shutdownOutput();System.out.println("======以下代码是读取响应的结果======"); // 接收服务器返回的数据InputStream inputStream = socket.getInputStream();byte[] buffer = new byte[1024];int len;while ((len = inputStream.read(buffer))!= -1) {System.out.println(new String(buffer, 0, len));}System.out.println("数据接收成功!"); // 关闭流inputStream.close();outputStream.close(); // 关闭socket连接socket.close(); } }
服务端
public class SocketServer {public static void main(String[] args) throws Exception {// 创建服务器socket对象ServerSocket sockServer = new ServerSocket(9999);System.out.println("服务器启动成功!"); // 等待客户端连接Socket socket = sockServer.accept();System.out.println("客户端连接成功!"); // 使用socket中的输入输出流进行通信,处理客户端请求InputStream inputStream = socket.getInputStream(); byte[] buffer = new byte[1024];int len = 0;while ((len = inputStream.read(buffer))!= -1) {System.out.println(new String(buffer, 0, len));} // 发送响应数据OutputStream outputStream = socket.getOutputStream();String response = "Hello, 铁头娃!";outputStream.write(response.getBytes()); // 关闭输入输出流outputStream.close();inputStream.close();// 关闭服务器socket对象socket.close();sockServer.close();} }
在网络编程中,客户端和服务器之间的通信需要明确的数据边界。如果客户端发送的数据没有明确的结束标记,服务器可能会一直等待更多的数据,而客户端则可能因为没有收到响应而卡住。解决这个问题的方法有几种:
-
固定长度的消息:客户端和服务器之间约定每条消息的固定长度。
-
特殊字符作为结束标记:客户端在消息末尾添加一个特殊的结束标记,服务器在读取到这个标记后停止读取。
-
数据包大小作为前缀:客户端在发送消息之前先发送消息的长度,服务器根据这个长度读取完整的消息。
通过这些方法,你可以确保客户端和服务器之间的通信具有明确的数据边界,避免因缺少结束标记而导致的问题。
UDP协议编程示例
发送端
public class DataGramSend {public static void main(String[] args) throws Exception {// 创建一个DatagramSocket,用于发送数据报// 无参:默认创建的DatagramSocket的端口号是0,表示系统自动分配一个可用端口号// 有参:创建的DatagramSocket的端口号是指定的端口号DatagramSocket socket = new DatagramSocket();System.out.println("DatagramSocket创建成功!"); // 创建DatagramPacket,用于封装要发送的数据// 第一个参数:发送的数据// 第二个参数:发送数据的长度// 第三个参数:接收方的IP地址// 第四个参数:接收方的端口号byte[] data = "Hello, 菊花侠!".getBytes();DatagramPacket packet = new DatagramPacket(data, data.length, InetAddress.getByName("127.0.0.1"), 8888);System.out.println("DatagramPacket创建成功!"); // 发送数据报socket.send(packet);System.out.println("数据报发送成功!"); // 关闭DatagramSocketsocket.close();System.out.println("DatagramSocket关闭成功!");} }
注意:UDP是不可靠的、无连接的通信,即使在没有接收端的情况下发送端也可以发送数据。
接收端
public class DataGramReceive {public static void main(String[] args) throws Exception {// 创建 DatagramSocket,用于接收数据报DatagramSocket socket = new DatagramSocket(8888);// 创建 byte 数组,用于接收数据byte[] buffer = new byte[1024];// 接收数据报,并将数据写入 bufferDatagramPacket packet = new DatagramPacket(buffer, buffer.length);socket.receive(packet); // 打印接收到的内容String message = new String(packet.getData(), 0, packet.getLength());System.out.println("接收到的数据报:" + message); // 关闭 DatagramSocketsocket.close();} }
相关文章:

06 网络编程基础
目录 1.通信三要素 1. IP地址(Internet Protocol Address) 2. 端口号(Port Number) 3. 协议(Protocol) 2.TCP与UDP协议 三次握手(Three-Way Handshake) 四次挥手(…...
Python 的 FastApi 如何在request 重复取request.body()
需求背景: 需要再中间件中获取body 中的信息 但是 又想要在之后 还可以重复取 这个body 因为有的接口写法是直接从body中获取参数,然而这个body是数据流的形式,一旦取一次就导致后面取不到里面的值了 。 解决方式: 1.保存请求体: 在中间件中读取请求…...

qt QFontDialog详解
1、概述 QFontDialog 是 Qt 框架中的一个对话框类,用于选择字体。它提供了一个可视化的界面,允许用户选择所需的字体以及相关的属性,如字体样式、大小、粗细等。用户可以通过对话框中的选项进行选择,并实时预览所选字体的效果。Q…...

AI时代,通才可能会占据更有利的地位
在AI时代,通才不仅有生存的可能,而且根据多个参考内容,他们实际上可能占据更有利的地位。以下几点解释了为什么通才在人工智能时代具有重要性和生存空间: 适应性和灵活性:通才因其广泛的知识基础和跨领域的技能&#x…...

qt QHeaderView详解
1、概述 QHeaderView 是 Qt 框架中的一个类,它通常作为 QTableView、QTreeView 等视图类的一部分,用于显示和管理列的标题(对于水平头)或行的标题(对于垂直头)。QHeaderView 提供了对这些标题的排序、筛选…...

探索PickleDB:Python中的轻量级数据存储利器
文章目录 探索PickleDB:Python中的轻量级数据存储利器1. 背景:为什么选择PickleDB?2. PickleDB是什么?3. 如何安装PickleDB?4. 简单的库函数使用方法创建和打开数据库设置数据获取数据删除数据保存数据库 5. 应用场景与…...
yocto下编译perf失败的解决方法
文章目录 问题分析库没有安装?文件缺少?解决参考问题 在新环境使用yocto编译镜像时,发现最后一直编译不过perf,具体的编译提示错误如下 ERROR: perf-1.0-r9 do_compile: oe_runmake failed ERROR: perf-1.0-r9 do_compile: Execution of /home/ub-1001/work/as66/imx8LBV…...

丹摩征文活动|详解 DAMODEL(丹摩智算)平台:为 AI 开发者量身打造的智算云服务
本文 什么是 DAMODEL(丹摩智算)?DAMODEL 的平台特性快速上手 DAMODEL 平台GPU 实例概览创建 GPU 云实例 储存选项技术支持与社区服务结语 在人工智能领域的飞速发展中,计算资源与平台的选择变得尤为重要。为了帮助 AI 开发者解决高…...
ORACLE _11G_R2_ASM 常用命令
--------查看磁盘组,(空间情况) select name,state,free_mb,total_mb,usable_file_mb from v$asm_diskgroup; --------查看磁盘情况 select GROUP_NUMBER,free_mb,total_mb,disk_number,MOUNT_STATUS,mode_status, HEADER_STATUS,name,PATH from v$asm_disk order …...
掌握Rust模式匹配:从基础语法到实际应用
本篇文章将探讨 Rust 编程语言中至关重要的特性之一——模式匹配。Rust 语言的模式匹配功能强大,不仅能处理简单的值匹配,还能解构和操作复杂的数据结构。通过深入学习模式匹配,程序员可以更加高效地编写出清晰、简洁且易于维护的代码。 Rus…...

HFSS 3D Layout中Design setting各个选项的解释
从HFSS 3D LAYOUT菜单中,选择Design Settings打开窗口,会有六个选项:DC Extrapolation, Nexxim Options, Export S Parameters, Lossy Dielectrics, HFSS Meshing Method, and HFSS Adaptive Mesh. DC Extrapolation 直流外推 直流外推分为标…...

线性表之链表详解
欢迎来到我的:世界 希望作者的文章对你有所帮助,有不足的地方还请指正,大家一起学习交流 ! 目录 前言线性表的概述链表的概述 内容链表的结构链表节点的定义 链表的基本功能单向链表的初始化链表的插入操作头插操作尾插操作 链表的删除操作头…...

C/C++使用AddressSanitizer检测内存错误
AddressSanitizer 是一种内存错误检测工具,编译时添加 -fsanitizeaddress 选项可以在运行时检测出非法内存访问,当发生段错误时,AddressSanitizer 会输出详细的错误报告,包括出错位置的代码行号和调用栈,有助于快速定位…...

【EI和Scopus检索】国际人工智能创新研讨会(IS-AII 2025)
国际人工智能创新研讨会(IS-AII 2025)将于2025年1月11日-1月14日在贵阳盛大举行。会议将聚焦计算机科学、人工智能、机器人科学与工程等相关研究领域,广泛邀请国内外知名专家学者,共同探讨相关学科领域的最新发展方向及行业前沿动…...
在OceanBase 中,实现自增列的4种方法
本文作者:杨敬博,爱可生 DBA 团队成员。 背景描述 在OceanBase数据库中,存在MySQL租户与Oracle租户两种模式,本文主要讲解在 OceanBase 的Oracle模式(以下简称OB Oracle),创建自增列的4种方式&…...
LWE算法分类及基本加解密算法示例
LWE(Learning With Errors)算法是一种基于格(lattice)的密码学原语,广泛应用于构建抗量子计算的加密方案。LWE算法的安全性基于最坏情况下的格问题(如最短向量问题SVP和最近向量问题CVP)&#x…...

【论文阅读】Learning dynamic alignment via meta-filter for few-shot learning
通过元滤波器学习动态对齐以实现小样本学习 引用:Xu C, Fu Y, Liu C, et al. Learning dynamic alignment via meta-filter for few-shot learning[C]//Proceedings of the IEEE/CVF conference on computer vision and pattern recognition. 2021: 5182-5191. 论文…...
蓝牙 SPP 协议详解及 Android 实现
文章目录 前言一、 什么是蓝牙 SPP 协议?SPP 的适用场景 二、SPP的工作流程1. 蓝牙设备初始化2. 设备发现与配对3. 建立 SPP 连接4. 数据传输5. 关闭连接 三、进阶应用与常见问题蓝牙连接中断与重试机制数据传输中的延迟与错误处理电池消耗和蓝牙优化 总结 前言 蓝…...
系统学习领域驱动设计-感悟-高尚名词篇
高尚名词 高尚名词通俗意思知识消化开发代码过程中的业务理解持续学习团队角度,持续沉淀文档沉淀业务理解,教会更多的新人,不让某些员工掌握知识壁垒...

人工智能(AI)和机器学习(ML)技术学习流程
目录 人工智能(AI)和机器学习(ML)技术 自然语言处理(NLP): Word2Vec: Seq2Seq(Sequence-to-Sequence): Transformer: 范式、架构和自注意力: 多头注意力: 预训练、微调、提示工程和模型压缩: 上下文学习、思维链、全量微调、量化、剪枝: 思维树、思维…...

linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...

ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...

Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...