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连接建立的过程,确保双方都准备好进行数据传输。以下是三次握手的步骤:

  1. 第一次握手

    • 客户端发送一个SYN(同步序列编号)包到服务器,并进入SYN_SEND状态,等待服务器确认。

    • SYN包中包含客户端的初始序列号(ISN),记为 Seq=A

  2. 第二次握手

    • 服务器收到客户端的SYN包后,回复一个SYN+ACK(同步确认)包,表示接受连接请求。

    • SYN+ACK包中包含服务器的初始序列号 Seq=B,以及对客户端SYN包的确认号 Ack=A+1

    • 服务器进入SYN_RECV状态。

  3. 第三次握手

    • 客户端收到服务器的SYN+ACK包后,发送一个ACK(确认)包,确认收到服务器的SYN+ACK包。

    • ACK包中包含对服务器SYN包的确认号 Ack=B+1,以及自己的序列号 Seq=A+1

    • 客户端进入ESTABLISHED状态。

    • 服务器收到客户端的ACK包后,也进入ESTABLISHED状态,连接建立完成。

四次挥手(Four-Way Waveoff)

四次挥手是TCP连接断开的过程,确保双方都正确地关闭连接。以下是四次挥手的步骤:

  1. 第一次挥手

    • 客户端发送一个FIN(结束)包到服务器,表示客户端已经没有数据要发送了。

    • 客户端进入FIN_WAIT_1状态。

  2. 第二次挥手

    • 服务器收到客户端的FIN包后,发送一个ACK(确认)包,确认收到客户端的FIN包。

    • ACK包中包含对客户端FIN包的确认号 Ack=A+1,以及自己的序列号 Seq=B

    • 服务器进入CLOSE_WAIT状态,客户端进入FIN_WAIT_2状态。

  3. 第三次挥手

    • 服务器发送一个FIN包到客户端,表示服务器也没有数据要发送了。

    • 服务器进入LAST_ACK状态。

  4. 第四次挥手

    • 客户端收到服务器的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();}
}

在网络编程中,客户端和服务器之间的通信需要明确的数据边界。如果客户端发送的数据没有明确的结束标记,服务器可能会一直等待更多的数据,而客户端则可能因为没有收到响应而卡住。解决这个问题的方法有几种:

  1. 固定长度的消息:客户端和服务器之间约定每条消息的固定长度。

  2. 特殊字符作为结束标记:客户端在消息末尾添加一个特殊的结束标记,服务器在读取到这个标记后停止读取。

  3. 数据包大小作为前缀:客户端在发送消息之前先发送消息的长度,服务器根据这个长度读取完整的消息。

通过这些方法,你可以确保客户端和服务器之间的通信具有明确的数据边界,避免因缺少结束标记而导致的问题。

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();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/466183.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用sealos部署的集群在部署metrics-server时日志x509

1、下载文件并进行部署 wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml2、进行部署 kubectl apply -f components.yaml3、发现问题 pod容器已经启动但是健康检查没有通过 kubectl get pod -n kube-system metrics-server…

定海 - 利用Coraza引擎开发一个防火墙

1. 介绍: Coraza有大量的内置安全规则,包括 OWASP Top 10,同时将错误警报降至最低。CRS保护免受许多常见攻击类别的攻击,包括SQL注入(SQLi)、跨站点脚本(XSS)、PHP和Java代码注入、HTTPoxy、Shellshock、脚…

【Linux】冯诺依曼体系、再谈操作系统

目录 一、冯诺依曼体系结构: 1、产生: 2、介绍: 二、再谈操作系统: 1、为什么要管理软硬件资源: 2、操作系统如何进行管理: 3、库函数: 4、学习操作系统的意义: 一、冯诺依曼…

bat批量处理脚本细节研究

文章目录 bat批处理脚本(框架)set变量设置基本语法显示环境变量 自定义环境变量临时环境变量和永久环境变量特殊环境变量和系统默认环境变量set命令利用选项的其他应用 !与%解析变量的区别/为什么使用setlocal enabledelayedexpansion区别%的规则!使用 %…

ReactPress系列—Next.js 的动态路由使用介绍

ReactPress Github项目地址:https://github.com/fecommunity/reactpress 欢迎提出宝贵的建议,感谢Star。 Next.js 的动态路由使用介绍 Next.js 是一个流行的 React 框架,支持服务端渲染、静态站点生成和动态路由等功能,极大地简化…

计算机的发展史

计算机的发展史是一个跨越多个世纪的过程,从最早的机械计算设备到如今的高性能、智能化计算机。以下是计算机发展史的简要概述,按重要的技术进步和里程碑进行归类: 1. 早期的计算工具(公元前3000年—17世纪) 计算机的…

基于STM32的实时时钟(RTC)教学

引言 实时时钟(RTC)是微控制器中的一种重要功能,能够持续跟踪当前时间和日期。在许多应用中,RTC用于记录时间戳、定时操作等。本文将指导您如何使用STM32开发板实现RTC功能,通过示例代码实现当前时间的读取和显示。 环…

Python | Leetcode Python题解之第537题复数乘法

题目: 题解: class Solution:def complexNumberMultiply(self, num1: str, num2: str) -> str:real1, imag1 map(int, num1[:-1].split())real2, imag2 map(int, num2[:-1].split())return f{real1 * real2 - imag1 * imag2}{real1 * imag2 imag1…

CoD-MIL: 基于诊断链提示的多实例学习用于全切片图像分类|文献速递-基于深度学习的病灶分割与数据超分辨率

Title 题目 CoD-MIL: Chain-of-Diagnosis Prompting Multiple Instance Learning for Whole Slide Image Classification CoD-MIL: 基于诊断链提示的多实例学习用于全切片图像分类 01 文献速递介绍 病理检查被广泛视为肿瘤诊断的金标准,因为它为治疗决策和患者…

232转485模块测试

概述 常用的PLC一般会有两个左右的232口,以及两个左右的485口,CAN口等,但是PLC一般控制的设备可能会有很多,会超出通讯口的数量,此时我们一般会采用一个口接多个设备,这种情况下要注意干扰等因素&#xff0…

网络编程——TCP通信练习

目录 一、多发多收 二、接收和反馈 三、上传文件 四、解决上传文件名重复问题 五、上传文件多线程版 六、上传文件线程池版 七、B/S(接收浏览器的消息并打印) 一、多发多收 客户端:多次发送数据 服务器:接收多次数据,并打印 public cl…

【stm32】RTC时钟的介绍与使用

RTC时钟的介绍与使用 一、时间戳1、Unix时间戳2、UTC/GMT3、时间戳转换 二、BKP简介及代码编写1、BKP简介2、BKP基本结构3、BKP库函数介绍:4、程序编写: 三、RTC简介及代码编写1、RTC简介2、RTC框图2、RTC基本结构3、RTC相关库函数介绍:4、程…

在docker中搭建redis哨兵环境

文章目录 一、引言二、环境准备前提条件目录结构 三、配置文件1. 主节点配置文件 sentinel-master.conf2. 从节点配置文件3. 哨兵配置文件 sentinel.conf4. Docker Compose 文件 四、启动 Docker Compose五、验证哨兵机制1. 检查主节点状态2. 检查从节点状态3. 检查哨兵状态4. …

职场高手揭秘,细节如何左右你的成败与升迁之路

身在职场,每一个人都想得到老板的器重,能不断地加薪、升职,从而获得职场的成功。但你知道,影响一个人职场成功,或者说影响升职加薪的最重要因素是什么吗? 许多人会说那要靠运气,也有人认为工作…

微信小程序 高校教材征订系统

文章目录 项目介绍具体实现截图技术介绍mvc设计模式小程序框架以及目录结构介绍错误处理和异常处理java类核心代码部分展示详细视频演示源码获取 项目介绍 系统分为三个角色,分别是教材科、系教学秘书、教研室主任。系统主要完成功能是教材科要发布教材征订信息&am…

RNN中的梯度消失与梯度爆炸问题

梯度消失与梯度爆炸问题 循环神经网络(Recurrent Neural Network,RNN)是一类具有短期记忆能力的神经网络.在循环神经网络中,神经元不但可以接受其他神经元的信息,也可以接受自身的信息,形成具有…

Unity网络开发基础(part5.网络协议)

目录 前言 网络协议概述 OSI模型 OSI模型的规则 第一部分 物理层 数据链路层 网络层 传输层 第二部分 ​编辑 应用层 表示层 会话层 每层的职能 TCP/IP协议 TCP/IP协议的规则 TCP/IP协议每层的职能 TCP/IP协议中的重要协议 TCP协议 三次握手 四次挥手 U…

ENSP GVRP动态学习VLAN

手工配置的VLAN称为静态VLAN,通过GVRP协议创建的VLAN称为动态VLAN。 GVRP有三种注册模式,不同的模式对静态VLAN和动态VLAN的处理方式也不同。 GVRP的三种注册模式分别定义如下: Normal模式:允许动态VLAN在端口上进行注册…

【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题

目录 1. 单例模式 (1) 饿汉模式 (2) 懒汉模式 1. 单线程版本 2. 多线程版本 2. 解决懒汉模式产生的线程安全问题 (1) 产生线程安全的原因 (2) 解决线程安全问题 1. 通过加锁让读写操作紧密执行 方法一 方法二 2. 处理加锁引入的新问题 问题描述 …

论文阅读:Computational Long Exposure Mobile Photography (二)

这篇文章是谷歌发表在 2023 ACM transaction on Graphic 上的一篇文章,介绍如何在手机摄影中实现长曝光的一些拍摄效果。 Abstract 长曝光摄影能拍出令人惊叹的影像,用运动模糊来呈现场景中的移动元素。它通常有两种模式,分别产生前景模糊或…