当前位置: 首页 > article >正文

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.kler.cn/a/287895.html

相关文章:

  • 如何使用Django写个接口,然后postman中调用
  • WebChromeClient 方法分类及其功能
  • web安全漏洞之ssrf入门
  • Tensorflow基本概念
  • RabbitMQ 与 PHP Swoole 实现
  • 数字IC后端低功耗设计实现案例分享(3个power domain,2个voltage domain)
  • 和字符串有关的经典OJ题——字符串的逆置和字符串的翻转
  • 【TPAMI 2024】Occlusion-Aware Self-Supervised Monocular 6D Object Pose Estimation
  • 音视频解码 AVIO内存输入模式
  • nexus 清理 docker 镜像
  • rv1126-rv1109-mkcramfs-mkfs.cramfs-打包文件系统
  • 干货含源码!如何用Java后端操作Docker(命令行篇)
  • 基于STM32实现智能园艺系统
  • 数据结构代码集训day14(适合考研、自学、期末和专升本)
  • 从零开始,认识游戏设计师(2)游戏源于设计师
  • 新加坡:区块链与加密货币的全球创新中心
  • FATE Board 执行流程探索
  • C++20 是 C++ 语言的一次重大更新
  • 【dp力扣】环绕字符串中唯一的子字符串
  • 【C语言】通讯录的实现(详解)
  • Ansible一键安装Harbor服务
  • 【C++ 面试 - STL】每日 3 题(四)
  • 软考计算机软件基础知识总结
  • Linux之Prometheus
  • Apache SeaTunnel 2.3.7发布:全新支持大型语言模型数据转换
  • 《从C/C++到Java入门指南》- 28.接口