Python进阶04-网络编程

零、文章目录

Python进阶04-网络编程

1、计算机网络

(1)IP地址的概念
  • IP 地址就是标识网络中设备的一个地址,好比现实生活中的家庭地址。
(2)IP地址的表现形式
  • IP 地址分为两类: IPv4 和 IPv6
  • IPv4 是目前使用的IP地址
  • IPv6 是未来使用的IP地址
  • IPv4 是由点分十进制组成
  • IPv6 是由冒号十六进制组成
(3)查看计算机的IP地址
  • Linux 和 mac OS 使用 ifconfig 这个命令
  • Windows 使用 ipconfig 这个命令
(4)检查网络是否正常
  • 检查网络是否正常使用 ping 命令
(5)端口号
  • 每运行一个网络程序都会有一个端口,想要给对应的程序发送数据,找到对应的端口即可。
  • 每一个端口都会有一个对应的端口号,好比每个教室的门都有一个门牌号,想要找到端口通过端口号即可
  • 操作系统为了统一管理这么多端口对端口进行了编号,端口号其实就是一个数字,端口号有65536个
  • 通信的流程:通过ip地址找到对应的设备,通过端口号找到对应的端口,然后通过端口把数据传输给应用程序。
(6)端口号分类
  • 知名端口号:

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

  • 动态端口号:

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

2、TCP协议

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

  • TCP通信步骤:

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

3、Socket技术

(1)Socket套接字
  • socket (简称 套接字) 是进程之间通信一个工具,好比现实生活中的插座,所有的家用电器要想工作都是基于插座进行,进程之间想要进行网络通信需要基于这个 socket。
(2)Socket 的作用与应用场景
  • Socket 的作用:负责进程之间的网络数据传输,好比数据的搬运工。
  • socket 使用场景:不夸张的说,只要跟网络相关的应用程序或者软件都使用到了 socket 。

4、编码转换

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

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

(2)转换函数

数据转换方法说明:

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

字符串编码:

python 复制代码
str.encode(encoding="utf-8")

二进制解码:

python 复制代码
bytes.decode(encoding="utf-8")

5、TCP网络应用程序开发

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

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 客户端程序开发示例代码
python 复制代码
'''
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()

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 服务端程序开发示例代码
python 复制代码
'''
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 服务端程序开发面向对象版本
python 复制代码
'''
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只能处理一个连接请求!
# 如何期望服务器端,可以同时处理多个客户端请求,怎么办呢?答:使用多任务编程 => 明天
相关推荐
你可以自己看25 分钟前
python的基础语法
开发语言·python
Flying_Fish_roe31 分钟前
linux-网络管理-网络抓包
linux·网络·php
akhfuiigabv2 小时前
使用Neo4j-Cypher-FT实现自然语言查询图数据库
数据库·python·oracle·neo4j
小技与小术2 小时前
lvs-nat模式实验详解
linux·运维·服务器·网络·lvs
繁依Fanyi2 小时前
828华为云征文|华为Flexus云服务器搭建OnlyOffice私有化在线办公套件
服务器·开发语言·前端·python·算法·华为·华为云
zhangfeng11332 小时前
在 PyTorch 中,除了 pad_sequence 还有哪些其他处理序列数据的函数?时间序列数据 预处理
人工智能·pytorch·python·深度学习
python1563 小时前
Python Numpy布尔数组在数据分析中的应用
python·数据分析·numpy
喵不拉几3 小时前
WebSocket 协议
网络·websocket·网络协议
AIAdvocate3 小时前
力扣-96.不同的二叉搜索树 题目详解
python·算法·动态规划
luthane3 小时前
python 实现entropy熵算法
python·算法·概率论