Python进阶04-网络编程

零、文章目录

Python进阶04-网络编程

1、计算机网络

  • 网络相关知识请参考计算机网络详解
(1)IP地址的概念
  • IP 地址就是标识网络中设备的一个地址,好比现实生活中的家庭地址。

image-20240818161632647

(2)IP地址的表现形式
  • IP 地址分为两类: IPv4 和 IPv6
  • IPv4 是目前使用的IP地址
  • IPv6 是未来使用的IP地址
  • IPv4 是由点分十进制组成
  • IPv6 是由冒号十六进制组成

image-20240818161741000

(3)查看计算机的IP地址
  • Linux 和 mac OS 使用 ifconfig 这个命令
  • Windows 使用 ipconfig 这个命令

image-20240818163355160

(4)检查网络是否正常
  • 检查网络是否正常使用 ping 命令

image-20240818163431113

(5)端口号
  • 每运行一个网络程序都会有一个端口,想要给对应的程序发送数据,找到对应的端口即可。

image-20240818163546145

  • 每一个端口都会有一个对应的端口号,好比每个教室的门都有一个门牌号,想要找到端口通过端口号即可

image-20240818163632667

  • 操作系统为了统一管理这么多端口对端口进行了编号,端口号其实就是一个数字,端口号有65536个
  • 通信的流程:通过ip地址找到对应的设备,通过端口号找到对应的端口,然后通过端口把数据传输给应用程序。

image-20240818163935510

(6)端口号分类
  • 知名端口号:

知名端口号是指众所周知的端口号,范围从0到1023。这些端口号一般固定分配给一些服务,比如21端口分配给FTP(文件传输协议)服务,25端口分配给SMTP(简单邮件传输协议)服务,80端口分配给HTTP服务。

  • 动态端口号:

一般程序员开发应用程序使用端口号称为动态端口号, 范围是从1024到65535。如果程序员开发的程序没有设置端口号,操作系统会在动态端口号这个范围内随机生成一个给开发的应用程序使用。注:当运行一个程序默认会有一个端口号,当这个程序退出时,所占用的这个端口号就会被释放。

2、TCP协议

(1)通信流程
  • 通过 IP 地址能够找到对应的设备,然后再通过端口号找到对应的端口,再通过端口把数据传输给应用程序。
  • 注意点:数据不能随便发送,在发送之前还需要选择一个对应的传输协议,保证程序之间按照指定的传输规则进行数据的通信,我们今天学习的 TCP就是其中一种协议。
(2)TCP概念
  • TCP 的英文全拼(Transmission Control Protocol)简称传输控制协议,它是一种面向连接的、可靠的、基于字节流的传输层通信协议。

  • TCP通信步骤:

    • ① 创建连接
    • ② 传输数据
    • ③ 关闭连接

image-20240818164702214

(3)TCP特点
  • 面向连接
    • 通信双方必须先建立好连接才能进行数据的传输,数据传输完成后,双方必须断开此连接,以释放系统资源。
  • 可靠传输
    • ① TCP采用发送应答机制
    • ② 超时重传
    • ③ 错误校验
    • ④ 流量控制和阻塞管理

3、Socket技术

(1)Socket套接字
  • socket (简称 套接字) 是进程之间通信一个工具,好比现实生活中的插座,所有的家用电器要想工作都是基于插座进行,进程之间想要进行网络通信需要基于这个 socket。

image-20240818173918804

(2)Socket 的作用与应用场景
  • Socket 的作用:负责进程之间的网络数据传输,好比数据的搬运工。
  • socket 使用场景:不夸张的说,只要跟网络相关的应用程序或者软件都使用到了 socket 。

image-20240818211642873

4、编码转换

(1)编码转换
  • 在计算机网络中,数据都是以二进制的形式进行传输的。所以在网络传输数据的时候,数据需要先编码转化为二进制(bytes)数据类型。

  • I Love Python => 字符串 => 转换为二进制数据 => 网络中传输

(2)转换函数

image-20240824211954400

数据转换方法说明:

函数名说明
encode编码 将字符串转化为字节码
decode解码 将字节码转化为字符串

字符串编码:

str.encode(encoding=”utf-8)

二进制解码:

bytes.decode(encoding=“utf-8)

5、TCP网络应用程序开发

(1)两种TCP网络应用程序开发
  • ① TCP 客户端程序开发:客户端程序是指运行在用户设备上的程序
  • ② TCP 服务端程序开发:服务端程序是指运行在服务器设备上的程序,专门为客户端提供数据服务。
(2)TCP 客户端程序开发流程
  1. 创建客户端套接字对象
  2. 和服务端套接字建立连接
  3. 发送数据
  4. 接收数据
  5. 关闭客户端套接字
(3)TCP 服务端程序开发流程的介绍
  • 创建服务端端套接字对象
  • 绑定端口号
  • 设置监听
  • 等待接受客户端的连接请求
  • 接收数据
  • 发送数据
  • 关闭套接字

image-20240818212126051

6、TCP 客户端程序开发

(1)开发 TCP 客户端程序步骤
  • ① 创建客户端套接字对象
  • ② 和服务端套接字建立连接
  • ③ 发送数据
  • ④ 接收数据
  • ⑤ 关闭客户端套接字
(2)Socket 类的使用
  • 导入 socket 模块:import socket
  • 创建客户端 socket 对象:socket.socket(AddressFamily, Type)
  • 参数说明:
    • AddressFamily 表示IP地址类型, 分为IPv4和IPv6
    • Type 表示传输协议类型
  • 方法说明:
    • connect((host, port)) :表示和服务端套接字建立连接, host是服务器ip地址,port是应用程序的端口号
    • send(data) :表示发送数据,data是二进制数据
    • recv(buffersize) :表示接收数据, buffersize是每次接收数据的长度
(3)TCP 客户端程序开发示例代码
'''
TCP客户端开发五步走:① 创建客户端套接字对象 ② 建立连接 ③ 发送数据 ④ 接收数据 ⑤ 关闭套接字对象
第一个知识点:
socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.AF_INET :IP v4
socket.SOCK_STREAM :TCP协议
第二个知识点:
tcp_client_socket.connect() => 连接服务器端(IP地址和端口号) => 参数是一个元组(IP地址,端口号)
第三个知识点:发送send()、接收数据recv(),注意事项:无论信息的发送还是接收都必须使用二进制流数据
encode() : 把字符串转二进制流数据
decode() : 把二进制流数据转换为字符串
'''
import socket# 第一步:创建客户端套接字对象
tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 第二步:创建连接
tcp_client_socket.connect(('127.0.0.1', 8000))
# 第三步:发送数据到服务器端
tcp_client_socket.send('I Love Python!'.encode('gbk'))
# 第四步:接收服务器端返回的应答数据
content = tcp_client_socket.recv(1024).decode('gbk')
print(f'服务器端返回的内容:{content}')
# 第五步:关闭套接字对象
tcp_client_socket.close()
  • 服务器调试助手下载地址:https://pan.baidu.com/s/1BuHUWBZgsz8SQDWA-PJ0ag?pwd=1234

image-20240820220954000

7、TCP服务端程序开发

(1)开发 TCP 服务端程序步骤
  • ① 创建服务端端套接字对象
  • ② 绑定端口号
  • ③ 设置监听
  • ④ 等待接受客户端的连接请求
  • ⑤ 接收数据
  • ⑥ 发送数据
  • ⑦ 关闭套接字
(2)Socket 类的使用
  • 导入 socket 模块:import socket
  • 创建服务端 socket 对象:socket.socket(AddressFamily, Type)
  • 参数说明:
    • AddressFamily 表示IP地址类型, 分为IPv4和IPv6
    • Type 表示传输协议类型
  • 方法说明:
    • bind((host, port)) 表示绑定端口号, host 是 ip 地址,port 是端口号,ip 地址一般不指定,表示本机的任何一个ip地址都可以
    • listen (backlog) 表示设置监听,backlog参数表示最大等待建立连接的个数
    • accept() 表示等待接受客户端的连接请求
    • send(data) 表示发送数据,data 是二进制数据
    • recv(buffersize) 表示接收数据, buffersize 是每次接收数据的长度
(3)TCP 服务端程序开发示例代码
'''
TCP服务器端开发七步走:① 创建服务器端套接字对象 ② 绑定IP和端口 ③ 开始监听 ④ 接收客户端连接请求 ⑤ 接收数据 ⑥ 发送数据 ⑦ 关闭套接字对象
第一个知识点:创建服务器端套接字对象
socket.socket(socket.AF_INET => IP v4, socket.SOCK_STREAM => TCP协议)
第二个知识点:绑定IP和端口
bind(元组参数) => bind(('IP地址', 端口号 => 建议8000以后))
第三个知识点:设置监听 => 设置允许最大的监听数 => 128
listen(整数参数)代表最大允许连接的总数
第四个知识点:接收客户端连接请求(关键点、难点)
accept()方法:接收客户端连接,accept方法在接收数据的同时,如何识别到底是哪个客户端发起的连接呢?
'''
import socket# 第一步:创建服务器端套接字对象
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 第二步:绑定IP和端口
tcp_server_socket.bind(('', 8000))  # 如果是绑定本机,也可以不写IP地址,会自动绑定
# 第三步:设置监听
tcp_server_socket.listen(128)
# 第四步:接收客户端连接
new_socket, ip_port = tcp_server_socket.accept()
# 第五步:接收客户端发送过来的数据
content = new_socket.recv(1024).decode()  # decode不写编码,默认也是gbk
print(f'{ip_port}客户端发送过来的数据:{content}')
# 第六步:响应数据给客户端(应答机制)
new_socket.send('信息已收到,over!'.encode('gbk'))
# 第七步:关闭新套接字对象(不能收发消息了)与服务器端套接字对象(不能接收客户端连接了)
new_socket.close()
tcp_server_socket.close()
(4)TCP 服务端程序开发面向对象版本
'''
TCP服务器端开发七步走:① 创建服务器端套接字对象 ② 绑定IP和端口 ③ 开始监听 ④ 接收客户端连接请求 ⑤ 接收数据 ⑥ 发送数据 ⑦ 关闭套接字对象
通过面向对象开发 => 分析有哪些对象 => 创建类 => 属性和方法
服务器端对象 => 服务器端类
'''
import socket# 第一步:创建WebServer类
class WebServer(object):# 第四步:定义魔术方法__init__()def __init__(self):# ① 创建服务器端套接字对象self.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# ② 绑定IP和端口号self.tcp_server_socket.bind(('', 8000))  # 192.168.89.68# ③ 设置监听self.tcp_server_socket.listen(128)# 第五步:定义一个start()方法 => 接收客户端连接def start(self):# ④ 接收客户端连接(允许多个客户端同时连接)while True:new_socket, ip_port = self.tcp_server_socket.accept()# ⑤ 接收客户端发送过来的信息content = new_socket.recv(1024).decode('gbk')print(f'{ip_port}客户端发送过来的数据:{content}')# ⑥ 返回数据给客户端(响应数据)data = input('请输入您要回复的内容:')new_socket.send(data.encode('gbk'))new_socket.close()# 第二步:实例化对象,调用__init__()初始化方法
ws = WebServer()
# 第三步:启动服务,接收客户端连接
ws.start()# 遗留问题:整个程序其实目前位置只能接收一个客户端,接收其他客户端,必须等待上一个连接结束,才可以继续连接发送接收数据,因为我们目前编写的程序都是单进程!一个Python只能处理一个连接请求!
# 如何期望服务器端,可以同时处理多个客户端请求,怎么办呢?答:使用多任务编程 => 明天

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

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

相关文章

【Python Web开发】Flask+HTML学习笔记

目录 Flask框架一、安装flask库二、运行一个网页三、库函数及变量 HTML标签语言一、基本格式二、标签2.1 块级标签2.1.1 标题2.1.2 div2.1.3 图片2.1.4 列表2.1.5 表格 2.2 行内标签2.2.1 span2.2.2 超链接2.2.3 输入 2.3 其他标签2.3.1 提交表单 Flask框架 一、安装flask库 …

探索Unity与C#的无限潜能:从新手到高手的编程之旅

在数字创意与技术创新交织的今天,Unity游戏引擎凭借其强大的跨平台能力和灵活的编程接口,成为了无数开发者心中的首选。而C#,作为Unity的官方脚本语言,更是以其面向对象的特性和丰富的库支持,为游戏开发注入了无限可能…

Golang | Leetcode Golang题解之第375题猜数字大小II

题目&#xff1a; 题解&#xff1a; func getMoneyAmount(n int) int {f : make([][]int, n1)for i : range f {f[i] make([]int, n1)}for i : n - 1; i > 1; i-- {for j : i 1; j < n; j {f[i][j] j f[i][j-1]for k : i; k < j; k {cost : k max(f[i][k-1], f[…

【JAVA入门】Day28 - 数据结构

【JAVA入门】Day28 - 数据结构 文章目录 【JAVA入门】Day28 - 数据结构一、栈二、队列三、数组3.1 ArrayList 四、链表4.1 LinkedList 五、二叉树5.1 二叉查找树5.2 二叉树的遍历方式5.3 平衡二叉树5.4 平衡二叉树的旋转5.5 平衡二叉树需要旋转的几种情况 六、红黑树6.1 红黑规…

永成防回水防回气装置煤矿毫不犹豫选择

永成防回水防回气装置煤矿毫不犹豫选择&#xff0c;不敢说我们有多好&#xff0c;我们只把简单的事做好&#xff0c;用心服务&#xff0c;因为品质&#xff0c;所以信任。因为信任&#xff0c;所以值得选择。 本防回水防回气装置是一种用于煤矿瓦斯管路爆渣和燃烧时防止回火、…

3_1_PID控制原理

自从计算机进入控制领域以来&#xff0c;用数字计算机代替模拟计算机调节器组成计算机控制系统&#xff0c;不仅可以用软件实现PID控制算法&#xff0c;而且可以利用计算机的逻辑功能&#xff0c;使PID控制更加灵活。数字PID控制在生产过程中是一种最普遍采用的控制方法&#x…

[Algorithm][综合训练][奇数位丢弃][求和][计算字符串的编辑距离]详细讲解

目录 1.奇数位丢弃1.题目链接2.算法原理详解 && 代码实现 2.求和1.题目链接2.算法原理详解 && 代码实现 3.计算字符串的编辑距离1.题目链接2.算法原理详解 && 代码实现 1.奇数位丢弃 1.题目链接 奇数位丢弃 2.算法原理详解 && 代码实现 解法…

YOLOv9改进策略【损失函数篇】| 利用MPDIoU,加强边界框回归的准确性

一、背景 目标检测和实例分割中的关键问题&#xff1a; 现有的大多数边界框回归损失函数在不同的预测结果下可能具有相同的值&#xff0c;这降低了边界框回归的收敛速度和准确性。 现有损失函数的不足&#xff1a; 现有的基于 ℓ n \ell_n ℓn​范数的损失函数简单但对各种尺度…

Redis与SpringMVC的整合与最佳实践

整合Redis与Spring MVC&#xff08;现在通常是Spring Boot的一部分&#xff09;可以提高应用性能&#xff0c;特别是在处理大量数据缓存和会话状态管理方面。 下面是一些关于如何整合Redis与Spring MVC的最佳实践&#xff1a; 1. 引入依赖 首先&#xff0c;你需要在你的项目中…

【Java】Maven多环境切换实战(实操图解)

Java系列文章目录 补充内容 Windows通过SSH连接Linux 第一章 Linux基本命令的学习与Linux历史 文章目录 Java系列文章目录一、前言二、学习内容&#xff1a;三、问题描述四、解决方案&#xff1a;4.1 Maven多环境配置学习4.2 切换环境4.2.1 先打包4.2.2 之后可以切换 五、总结…

【ACM独立出版 | 厦大主办】第五届计算机科学与管理科技国际学术会议(ICCSMT 2024,10月18-20)

第五届计算机科学与管理科技国际学术会议(ICCSMT 2024) 定于2024年10月18-20日在中国厦门举行。 会议旨在为从事“计算机科学”与“管理科技”研究的专家学者、工程技术人员、技术研发人员提供一个共享科研成果和前沿技术&#xff0c;了解学术发展趋势&#xff0c;拓宽研究思路…

设计模式结构型模式之适配器模式

结构型模式之适配器模式 一、概述和使用场景1、概述2、使用场景&#xff1a;3、主要分类 二、 代码示例1、类适配器模式2、接口适配器3、对象适配器 四、总结1、适配器模式2、适配器模式的优点3、适配器模式的缺点 一、概述和使用场景 1、概述 适配器模式是一种结构型设计模式…

力扣面试经典算法150题:整数转罗马数字

整数转罗马数字 今天的题目是力扣面试经典150题中的数组的中等难度题&#xff1a; 整数转罗马数字。 题目链接&#xff1a;https://leetcode.cn/problems/integer-to-roman/description/?envTypestudy-plan-v2&envIdtop-interview-150 题目描述 七个不同的符号代表罗马…

SprinBoot+Vue餐厅点餐系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质…

stm32智能颜色送餐小车(ESP8266WIFI模块、APP制作、物联网模型建立、MQTTFX)

大家好啊&#xff0c;我是情谊&#xff0c;今天我们来介绍一下我最近设计的stm32产品&#xff0c;我们在今年七月份的时候参加了光电设计大赛&#xff0c;我们小队使用的就是stm32的智能送餐小车&#xff0c;虽然止步于省赛&#xff0c;但是还是一次成长的经验吧&#xff0c;那…

java在项目中实现excel导入导出

一、初识EasyExcel* 1. Apache POI 先说POI&#xff0c;有过报表导入导出经验的同学&#xff0c;应该听过或者使用。 Apache POI是Apache软件基金会的开源函式库&#xff0c;提供跨平台的Java API实现Microsoft Office格式档案读写。但是存在如下一些问题&#xff1a; 1.1 …

SpringBoot 项目——抽奖系统

本项目主要实现的功能是&#xff1a;主要服务于管理员用户&#xff0c;其可圈选奖品&#xff0c;人员来创建抽奖活动&#xff0c;并进行在线抽奖&#xff0c;并可通过短信或邮件的方式通知中奖者&#xff0c;同时普通用户可查看已结束的抽奖活动的中奖结果&#xff1b; 一、项…

TESSY创建单元测试或集成测试工程

我们以tessy5.1 IDE为例&#xff0c;给大家展示工程的创建过程。 1、打开TESSY5.1软件后&#xff0c;会弹出&#xff1a; 2、点击NEW Project后&#xff0c;会弹出&#xff1a; 3、接下来&#xff0c;就可以打开刚创建的工程&#xff1a; 4、进入到TESSY的主界面后&#xff0c…

Python办公自动化 获取文本数据 支持多种类型文件

学好办公自动化,走遍天下都不怕&#xff01;&#xff01; 前面我们已经学习了&#xff0c;如何用python的下载安装以及入门基础知识&#xff0c;并且也知道如何使用python自动处理Excel文件数据、如何批量生成Word文件、如何对数据分析后生成洞察报告、如何用python实现自动发送…

React中实现antd自定义图标,鼠标悬浮变色

借助 antd 的 tooltip 组件来实现 hover 时变色的效果 1.新建组件 自定义图标一般在iconfont上面获取&#xff0c;复制下来的svg代码&#xff0c;切记要删除 fill 属性后添加到组件中 import { Tooltip } from "antd"; import React from "react";const …