Python3 网络编程详解
概述
Python 提供了丰富的网络编程支持,包括低级别的 Socket 编程和高级别的 SocketServer 模块。本文将详细介绍如何在 Python 中使用 Socket 进行网络编程,并通过具体的代码示例来展示服务器和客户端的实现。
什么是 Socket?
Socket 又称“套接字”,是应用程序通过网络进行通信的接口。应用程序通常通过“套接字”向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。
Socket 编程基础
1. 创建 Socket
在 Python 中,我们使用 socket()
函数来创建套接字。语法格式如下:
socket.socket([family[, type[, proto]]])
family
:套接字家族可以是AF_UNIX
或者AF_INET
。type
:套接字类型可以是SOCK_STREAM
(面向连接的 TCP)或SOCK_DGRAM
(无连接的 UDP)。proto
:一般不填,默认为 0。
2. 常用的 Socket 方法
方法 | 描述 |
---|---|
s.bind(address) | 绑定地址(host, port)到套接字。 |
s.listen(backlog) | 开始 TCP 监听。backlog 指定在拒绝连接之前,操作系统可以挂起的最大连接数量。 |
s.accept() | 被动接受 TCP 客户端连接,返回 (conn, address),其中 conn 是新的套接字对象,address 是客户端地址。 |
s.connect(address) | 主动初始化 TCP 服务器连接。 |
s.connect_ex(address) | connect() 函数的扩展版本,出错时返回出错码,而不是抛出异常。 |
s.recv(bufsize[, flags]) | 接收 TCP 数据,返回值是接收到的数据。 |
s.send(string[, flags]) | 发送 TCP 数据,返回值是发送的字节数。 |
s.sendall(string[, flags]) | 完整发送 TCP 数据,成功返回 None ,失败抛出异常。 |
s.recvfrom(bufsize[, flags]) | 接收 UDP 数据,返回值是 (data, address)。 |
s.sendto(string, address) | 发送 UDP 数据到指定地址。 |
s.close() | 关闭套接字。 |
s.getpeername() | 返回连接套接字的远程地址。 |
s.getsockname() | 返回套接字自己的地址。 |
s.setsockopt(level, optname, value) | 设置给定套接字选项的值。 |
s.getsockopt(level, optname[, buflen]) | 返回套接字选项的值。 |
s.settimeout(timeout) | 设置套接字操作的超时期。 |
s.gettimeout() | 返回当前超时期的值。 |
s.fileno() | 返回套接字的文件描述符。 |
s.setblocking(flag) | 设置套接字为阻塞或非阻塞模式。 |
s.makefile() | 创建一个与该套接字相关联的文件对象。 |
简单实例
1. 服务端
服务端代码如下:
#!/usr/bin/python3
# 文件名:server.py
# 导入 socket、sys 模块
import socket
import sys
# 创建 socket 对象
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 获取本地主机名
host = socket.gethostname()
# 设置端口号
port = 9999
# 绑定端口号
serversocket.bind((host, port))
# 设置最大连接数,超过后排队
serversocket.listen(5)
while True:
# 建立客户端连接
clientsocket, addr = serversocket.accept()
print("连接地址: %s" % str(addr))
msg = '欢迎访问菜鸟教程!' + "\r\n"
clientsocket.send(msg.encode('utf-8'))
clientsocket.close()
import socket
:导入 socket 模块。import sys
:导入 sys 模块。serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
:创建一个 TCP 套接字对象。host = socket.gethostname()
:获取本地主机名。port = 9999
:设置端口号。serversocket.bind((host, port))
:将套接字绑定到指定的地址和端口。serversocket.listen(5)
:开始监听,最多允许 5 个连接排队。while True:
:无限循环,等待客户端连接。clientsocket, addr = serversocket.accept()
:接受客户端连接,返回新的套接字对象和客户端地址。print("连接地址: %s" % str(addr))
:打印客户端地址。msg = '欢迎访问菜鸟教程!' + "\r\n"
:准备发送的消息。clientsocket.send(msg.encode('utf-8'))
:发送消息。clientsocket.close()
:关闭客户端连接。
2. 客户端
客户端代码如下:
#!/usr/bin/python3
# 文件名:client.py
# 导入 socket、sys 模块
import socket
import sys
# 创建 socket 对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 获取本地主机名
host = socket.gethostname()
# 设置端口号
port = 9999
# 连接服务,指定主机和端口
s.connect((host, port))
# 接收小于 1024 字节的数据
msg = s.recv(1024)
s.close()
print(msg.decode('utf-8'))
import socket
:导入 socket 模块。import sys
:导入 sys 模块。s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
:创建一个 TCP 套接字对象。host = socket.gethostname()
:获取本地主机名。port = 9999
:设置端口号。s.connect((host, port))
:连接到指定的主机和端口。msg = s.recv(1024)
:接收不超过 1024 字节的数据。s.close()
:关闭套接字。print(msg.decode('utf-8'))
:打印接收到的消息。
测试
-
打开第一个终端,运行服务端代码:
$ python3 server.py
-
打开第二个终端,运行客户端代码:
$ python3 client.py
客户端终端会输出:
欢迎访问菜鸟教程!
-
查看第一个终端,会看到有以下信息输出:
连接地址: ('192.168.0.118', 33397)
Python Internet 模块
Python 提供了许多用于网络编程的模块,以下是常用的几个模块及其功能:
协议 | 功能用处 | 端口号 | Python 模块 |
---|---|---|---|
HTTP | 网页访问 | 80 | http.client , urllib , xmlrpc.client |
NNTP | 阅读和张贴新闻文章,俗称为"帖子" | 119 | nntplib |
FTP | 文件传输 | 20 | ftplib , urllib |
SMTP | 发送邮件 | 25 | smtplib |
POP3 | 接收邮件 | 110 | poplib |
IMAP4 | 获取邮件 | 143 | imaplib |
Telnet | 命令行 | 23 | telnetlib |
Gopher | 信息查找 | 70 | gopherlib , urllib |
总结
本文详细介绍了如何在 Python 中使用 Socket 进行网络编程,并通过具体的代码示例展示了服务器和客户端的实现。通过使用 socket
模块,我们可以创建和管理套接字,实现基本的网络通信功能。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)