Python中的客户端和服务端交互的基本内容

目录

网络协议

网络的通信方式

需要安装的组件和需要导入的包模块

安装的组件

导入包模块

如何创建客户端

如何创建服务端


网络协议

IPV4:是互联网协议的第四版,也是目前广泛使用的网络协议。它使用32位地址格式,理论上可以提供约43亿个唯一的IP地址。

IPv4地址通常以点分十进制格式表示,例如192.168.1.1。这种协议在互联网的早期发展中起到了关键作用,但由于地址资源有限,随着互联网的快速发展,IPv4地址逐渐耗尽。所以为了解决这种情况,所以推出了IPV6

IPV6:是IPv4的下一代协议,旨在解决IPv4地址不足的问题。IPv6使用128位地址格式,能够提供几乎无限的地址空间。

IPv6地址通常以冒号分隔的十六进制格式表示,例2001:0db8:85a3:0000:0000:8a2e:0370:7334。除了地址数量的巨大优势,IPv6还提供了更好的安全性、更高效的路由机制以及对多播和任播的支持。

网络的通信方式

异步通信

异步通信是一种数据传输方式,发送方和接收方的时钟是独立的,它们之间没有严格的同步关系。在这种通信方式中,数据通常以字符为单位传输,每个字符之间有明确的起始位和停止位来标识数据的开始和结束。异步通信的优点是简单灵活,适用于低速通信场景,例如串行端口通信。然而,由于没有严格的时钟同步,数据传输效率相对较低,且容易受到噪声干扰。

同步通信

同步通信则要求发送方和接收方的时钟严格同步。数据以数据块(如帧)的形式传输,每个数据块的开始和结束由同步信号标识。同步通信的优点是数据传输效率高,适合高速通信场景,例如以太网通信。然而,同步通信需要精确的时钟同步机制,对硬件要求较高,且对噪声更为敏感。

三次握手

三次握手是TCP协议建立连接的过程。它确保了双方在通信之前已经准备好,并且能够正确接收和发送数据。三次握手的过程如下:

  1. SYN(同步序列号):客户端向服务器发送一个SYN包,请求建立连接,并随机生成一个初始序列号X

  2. SYN-ACK(同步序列号确认):服务器收到SYN包后,回复一个SYN-ACK包,确认客户端的请求,并随机生成自己的初始序列号Y,同时将客户端的序列号X加1后返回。

  3. ACK(确认):客户端收到SYN-ACK包后,发送一个ACK包,确认服务器的序列号Y,并将序列号Y加1后返回。此时,连接建立完成。

四次握手

四次握手是TCP协议关闭连接的过程。它确保了双方在关闭连接之前已经完成所有数据的传输。四次握手的过程如下:

  1. FIN(结束):客户端向服务器发送一个FIN包,表示客户端已经完成数据发送。

  2. ACK(确认):服务器收到FIN包后,回复一个ACK包,确认客户端的结束请求。

  3. FIN(结束):服务器在完成自己的数据发送后,也向客户端发送一个FIN包,表示服务器也已经完成数据发送。

  4. ACK(确认):客户端收到服务器的FIN包后,回复一个ACK包,确认服务器的结束请求。此时,连接关闭。

需要安装的组件和需要导入的包模块

安装的组件

在进行网络编程时,通常需要安装以下组件:

  • 操作系统支持的网络协议栈:例如TCP/IP协议栈,这是操作系统自带的,用于支持网络通信。

  • 编程语言的运行环境:例如Python的Python解释器、Java的JDK等。

  • 网络开发工具:例如Wireshark(用于抓包分析)、Postman(用于测试HTTP请求)等。

导入包模块

在Python中,进行网络编程通常需要导入以下模块:

  • socket模块:用于创建和管理网络套接字。

  • select模块:用于实现I/O多路复用。

  • threading模块:用于实现多线程编程,提高程序的并发能力。

  • asyncio模块:用于实现异步编程,提高程序的效率。

如何创建客户端

import socket# 创建socket对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 连接到服务器
server_address = ('127.0.0.1', 8080)
client_socket.connect(server_address)try:# 向服务器发送数据message = 'Hello, Server!'client_socket.sendall(message.encode('utf-8'))# 接收服务器响应response = client_socket.recv(1024)print(f"Received: {response.decode('utf-8')}")finally:# 关闭连接client_socket.close()

如何创建服务端

import socket# 创建socket对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 绑定地址和端口
server_address = ('127.0.0.1', 8080)
server_socket.bind(server_address)# 开始监听
server_socket.listen(5)
print("Server is listening on port 8080...")try:while True:# 接受客户端连接client_socket, client_address = server_socket.accept()print(f"Connection from {client_address}")try:# 接收客户端数据data = client_socket.recv(1024)if data:print(f"Received: {data.decode('utf-8')}")# 向客户端发送响应response = "Hello, Client!"client_socket.sendall(response.encode('utf-8'))finally:# 关闭客户端连接client_socket.close()
finally:# 关闭服务器socketserver_socket.close()

注:单独创建服务端是可以直接运行的,但单独创建客户端可以编译,但是无法运行,因为没有开启对服务器的请求处于本地状态,无法进行数据消息交互传递

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

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

相关文章

【硬核攻坚】告别CUDA OOM!DeepSeek部署显存瓶颈终极解决方案:三大策略高效落地

目录 引言:大模型落地的“甜蜜”与“烦恼”DeepSeek剖析:为何它如此“吃”显存?CUDA OOM的“幽灵”:现象、根因与诊断破局之道:三大策略驯服显存“猛兽” 策略一:模型量化 - 给模型“瘦身”的艺术策略二:动态优化 - 榨干硬件潜能策略三:分布式扩展 - 集群的力量实战演练…

JavaSE核心知识点01基础语法01-01(关键字、标识符、变量)

🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 JavaSE核心知识点01基础语法01-01&#xff0…

【最新Python包管理工具UV的介绍和安装】

介绍 uv是一个非常快的 Python 包安装程序和 pip 解析器,用 Rust 编写,设计为pip-tools的直接替代品。 以下是官网给出的UV与其他包管理工具解决依赖(左)和安装包(右)的对比图。 可以看出UV是一个极快的 P…

麒麟、UOS系统在线打开word文件并提取修订痕迹

麒麟、UOS系统在线打开word文件并提取修订痕迹 查看本示例演示效果(Windows版) 查看本示例演示效果(国产版)本示例关键代码的编写位置,请参考“开始 - 快速上手”里您所使用的开发语言框架的最简集成代码 注意 本文中…

【SpringAI+阿里云百炼】AI对话4个Demo

基于SpringAI和阿里云百炼平台,实现了四个AI对话的小Demo 小团团对话机器人哄哄模拟器培训班智能客服仿ChatPDF 笔记如下:语雀知识笔记《SpringAI》

【数据结构】单链表的增删查改

本文是小编巩固自身而作,如有错误,欢迎指出! 1.链表的概念 概念:链表是⼀种物理存储结构上⾮连续、⾮顺序的存储结构,数据元素的逻辑顺序是通过链表中的 指针链接次序实现的。 和之前的顺序表不同,顺序一般…

LeetCode 1128.等价多米诺骨牌对的数量:计数

【LetMeFly】1128.等价多米诺骨牌对的数量:计数 力扣题目链接:https://leetcode.cn/problems/number-of-equivalent-domino-pairs/ 给你一组多米诺骨牌 dominoes 。 形式上,dominoes[i] [a, b] 与 dominoes[j] [c, d] 等价 当且仅当 (a …

以太坊智能合约开发框架:Hardhat v2 核心功能从入门到基础教程

一、设置项目 Hardhat 项目是安装了 hardhat 包并包含 hardhat.config.js 文件的 Node.js 项目。 操作步骤: ①初始化 npm npm init -y②安装 Hardhat npm install --save-dev hardhat③创建 Hardhat 项目 npx hardhat init如果选择 Create an empty hardhat.…

安卓基础(无障碍点击)

无障碍点击核心代码 // 自定义无障碍服务类,继承自Android系统的AccessibilityService public class MyAccessibilityService extends AccessibilityService {// 当系统产生无障碍事件时的回调方法(如界面变化、焦点切换等)Overridepublic v…

阿里云服务迁移实战: 05-OSS迁移

概述 Bucket 复制分为两种,同区域复制和跨区域复制 同账号复制比较简单,根据提示填写信息即可,本文主要介绍跨账号复制。 同区域复制 授权角色选择 “AliyunOSSRole”, 创建方法见 “跨区域复制”。然后点击确定即可。 跨区域复制 假设我…

Qt 的信号与槽机制依赖元对象系统(Meta-Object System)实现

内部数据结构 在 Qt 中,信号和槽之间的连接主要通过 QObject 类及其相关的私有类进行管理。每个 QObject 实例都维护着一个指向其 QMetaObject 的指针,该对象包含了有关类的所有元信息,包括信号、槽等。此外,还有一个关键的数据结构用于存储信号与槽之间的连接信息,即 Co…

前端面试宝典---性能优化

一、加载优化 1. 第三方模块放在CDN 例如 leaflet通过cdn引入,这样就不会占用打包体积了 2. prefetch 预加载 例如,之后马上有个场景需要一个图片,我们就可以通过link 的 prefetch 对资源进行预先加载 再例如,我们公司是无网络开…

从零开始:Android Studio开发购物车(第二个实战项目)

一年经验的全栈程序员,目前头发健在,但不知道能撑多久。 文章目录 前言 一、页面编写 1. 顶部标签栏title_shopping.xml 2. 商品展现列表activity_shopping_channel.xml 3. 商品详情页面activity_shopping_detail.xml 4. 购物车页面activity_shopping…

PostgteSQL for Everybody基础部分笔记

笔记分享内容参考密歇根大学 Charles Russell Severance 开设的PostgreSQL课程:postgresql-for-everybody,网址为:https://www.coursera.org/specializations/postgresql-for-everybody#courses,在B站等也有相关视频分享。 我分享…

Python项目源码63:病历管理系统1.0(tkinter+sqlite3+matplotlib)

1.病历管理系统包含以下主要功能: 核心功能:病历信息录入(患者姓名、年龄、性别、诊断结果、主治医生),自动记录就诊时间,病历信息展示(使用Treeview表格),病历信息查询…

MCP底层协议完整通信过程

2025 年是智能体的元年, 也注定是智能体集中爆发的一年! 两个互联领域的重大挑战: 第一、 Agent 与 Tools (工具)的交互 Agent 需要调用外部工具和 API

docker:制作镜像+上传镜像+拉取镜像

1.dockerfile制作镜像 示例内容: 1.创建一个index.js的文件 console.log("hello world")2.在相同目录下创建名为dockerfile的文件 FROM node:alpine COPY index.js /index.js CMD node /index.js3.构建镜像 docker build -t minterra/hello-docker . …

docker制作python大模型镜像(miniconda环境),工程改造记录

**环境说明:**从系统镜像开始打造python大模型镜像,之前是人工手动装的方式,并且模型和依赖在公网中,对于离线交付环境不太友好,所以打造的离线化交付版本 Dockerfile: FROM centos:7.9 ENV PYTHONIOENCODINGutf-8 E…

Rust中避免过度使用锁导致性能问题的策略

一、引言 在 Rust 多线程编程中,锁是实现线程同步的重要工具,它可以防止多个线程同时访问和修改共享数据,从而避免数据竞争和不一致的问题。然而,过度使用锁会带来严重的性能问题,如锁竞争导致的线程阻塞、上下文切换…

数据结构每日一题day15(链表)★★★★★

题目描述:将一个带头结点的单链表A分解为两个带头结点的单链表A和 B,使得A表中含有原表中序号为奇数的元素,而B表中含有原表中序号为偶数的元素,且保持相对顺不变,最后返回 B 表。 算法思想: 1.初始化: 创建新链表 B 的头结点。…