Python 网络编程基础
网络概念
将具有独立功能的多台计算机通过通信线路和通信设备连接起来,在网络管理软件及网络通信协议下,实现资源共享和信息传递的虚拟平台。
Python 网络编程主要涉及计算机间的通信机制,核心要素包括 IP 地址、端口号及通信协议。TCP 协议作为可靠的传输层协议,通过三次握手建立连接、四次挥手断开连接。Socket 套接字是实现进程间网络通信的关键接口,Python 通过 socket 模块提供相关功能。开发流程包含创建套接字、绑定地址、监听连接、收发数据及资源释放。数据传输需处理字符串与字节流的编码转换,并可通过设置端口重用解决端口占用问题,支持文本及图片文件的上传下载。

将具有独立功能的多台计算机通过通信线路和通信设备连接起来,在网络管理软件及网络通信协议下,实现资源共享和信息传递的虚拟平台。

要使用编程语言实现多台计算机的网络通信,需要具备网络编程三个要素:

ifconfig 命令ipconfig 命令使用 ping 命令:
ping www.baidu.com:检查是否能上公网ping <当前局域网 IP>:检查是否在同一个局域网内ping 127.0.0.1:检查本地网卡是否正常

通信过程中,数据不能随便发送,在发送之前还需要规则,以保证程序之间按照指定的规则来进行数据的通信,这个规则就是 TCP 协议。

TCP 通信模型相当于生活中的打电话,在通信开始之前,一定要先建立好连接,才能发送数据,通信结束要关闭连接。
三次握手 (Three-Way Handshake) 就是指建立一个 TCP 连接时,需要客户端和服务端总共发送 3 个包以确认连接的建立。

四次挥手指 TCP 断开链接的时候需要经过 4 次确认。TCP 连接是双向的,A 连接 B、B 连接 A 都要断开。

Socket(简称套接字) 是一个进程之间的通信工具,进程之间想要进行网络通信需要基于这个 Socket。


import socket
"""
目标:创建了一个 TCP 套接字连接
1. 导入 socket 模块
2. 使用 socket.socket() 函数创建一个基于 IPv4(AF_INET) 的 TCP 流套接字(SOCK_STREAM)
3. 最后打印出这个套接字对象的信息。
"""
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print(tcp_socket)

当有了 socket 对象后,常用于服务器端的函数如下:

"""
服务端与客户端通信
开发流程:
1. 创建 socket 对象
2. 绑定 ip 和端口号
3. 设置最大监听数
4. 等待客户端连接
5. 给客户端发送消息
6. 接收客户端的消息并打印
7. 释放资源
细节:客户端和服务端使用字节流(bytes) 的形式交互数据
"""
import socket
# 创建 socket 对象,socket.AF_INET 表示 ipv4,socket.SOCK_STREAM 表示字节流(TCP)
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(("127.0.0.1", 8080))
server_socket.listen(5)
# 等待客户端建立连接,accept_socket 表示连接对象 (用于后续通信),client_info 表示客户端信息
accept_socket, client_info = server_socket.accept()
# 给客户端发送消息
accept_socket.send(b"hello world")
# 接收客户端的消息并打印
data = accept_socket.recv(1024).decode("utf-8")
print(f'服务端收到信息:{data}, 客户端是:{client_info}')
# 释放资源
accept_socket.close()
# 服务器端一般不关闭 server_socket
当有了 socket 对象后,常用于客户端的函数如下:

"""
客户端与服务端通信
开发流程:
1. 创建 socket 对象
2. 连接服务端,指定 ip 和端口
3. 接收服务端的信息并打印
4. 给服务端发送消息
5. 释放资源
"""
import socket
# 创建客户端
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 创建连接
client_socket.connect(("127.0.0.1", 8080))
# 接收服务端信息并打印
data = client_socket.recv(1024).decode("utf-8")
print(f'服务端发送信息:{data}')
# 给服务端发送消息
client_socket.send("Socket 挺厉害呢!".encode("utf-8"))
# 释放资源
client_socket.close()
在网络中,数据是以二进制数据类型 bytes 的形式进行传递的,所以在我们向网络传输数据的时候需要把数据转化成二进制,从网络中接受到的数据默认也是二进制类型的数据,想要正常使用这些数据也需要把这些数据从二进制类型数据转化为字符串 str 型。


"""
演示编解码
1. 编码 = 把数据转成二进制 '字符串'.encode(码表)
2. 解码 = 把二进制转成数据 二进制.decode(码表)
3. 只要乱码了,就是编码出现了不同
4. 英文字母,数字,特殊符号无论什么码表都只占 1 个字节,中文在 gbk 中占 2 个字节,在 utf-8 中占 3 个字节
5. 二进制数据特殊写法,b'字母 数字 特殊符号',该方式不支持中文
"""
# 编码
s1 = '你好'
print(s1.encode()) # b'\xe4\xbd\xa0\xe5\xa5\xbd'
print(s1.encode('utf-8')) # b'\xe4\xbd\xa0\xe5\xa5\xbd'
print(s1.encode('gbk')) # b'\xc4\xe3\xba\xc3'
# 解码
bys = b'\xe4\xbd\xa0\xe5\xa5\xbd'
print(type(bys)) # <class 'bytes'>
print(bys.decode()) # 你好
print(bys.decode('utf-8')) # 你好
print(bys.decode('gbk')) # 乱码
当客户端和服务端建立连接后,服务端程序退出后端口号不会立即释放,需要等待大概 1-2 分钟。解决办法有两种:
设置端口号复用的代码如下:


"""
客户端上传文本文件
"""
import socket
# 创建客户端
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 创建连接
client_socket.connect(("127.0.0.1", 8080))
# 关联数据源文件,读取内容,发送给服务器
with open("data.txt", "rb") as src_f:
while True:
data = src_f.read(8192)
client_socket.send(data)
if len(data) == 0:
break
# 释放资源
client_socket.close()
"""
服务端接收文本文件
"""
import socket
# 创建 socket 对象,socket.AF_INET 表示 ipv4,socket.SOCK_STREAM 表示字节流(TCP)
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(("127.0.0.1", 8080))
server_socket.listen(5)
# 等待客户端建立连接,accept_socket 表示连接对象 (用于后续通信),client_info 表示客户端信息
accept_socket, client_info = server_socket.accept()
with open("my_data.txt", "wb") as dest_f:
while True:
# 接收客户端文件数据
bys = accept_socket.recv(8192)
if len(bys) == 0:
break
# 写入操作
dest_f.write(bys)
# 释放资源
accept_socket.close()
"""
客户端上传图片文件
"""
import socket
# 创建客户端
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 创建连接
client_socket.connect(("127.0.0.1", 8080))
# 关联数据源文件,读取内容,发送给服务器
with open("字体 1.jpg", "rb") as src_f:
while True:
data = src_f.read(8192)
client_socket.send(data)
if len(data) == 0:
break
# 释放资源
client_socket.close()
"""
服务端接收图片文件
"""
import socket
# 创建 socket 对象,socket.AF_INET 表示 ipv4,socket.SOCK_STREAM 表示字节流(TCP)
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(("127.0.0.1", 8080))
server_socket.listen(5)
while True:
try:
# 等待客户端建立连接
accept_socket, client_info = server_socket.accept()
with open("001.jpg", "wb") as dest_f:
while True:
# 接收客户端文件数据
bys = accept_socket.recv(8192)
if len(bys) == 0:
break
# 写入操作
dest_f.write(bys)
# 释放资源
accept_socket.close()
except:
pass

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online