Python 网络编程:掌握 Socket 与高级协议
Python 提供两级网络服务访问。低级可访问操作系统基础 Socket 支持,实现面向连接和无连接协议的客户端/服务端。高级库提供 FTP、HTTP 等应用层协议访问。
本章深入讲解网络编程核心概念 —— Socket 编程。
什么是 Socket?
Socket 是双向通信通道的端点。可进程内通信、同机进程间通信、跨大陆进程间通信。
Socket 可基于多种通道类型实现:Unix 域套接字、TCP、UDP 等。socket 库提供常用传输的特定类及通用接口。
Socket 术语表:
| 序号 | 术语及说明 |
|---|---|
| 1 | Domain(域):作为传输机制的协议族,常量如 AF_INET, PF_INET, PF_UNIX, PF_X25 等。 |
| 2 | type(类型):端点间通信类型,通常 SOCK_STREAM 面向连接,SOCK_DGRAM 无连接。 |
| 3 | protocol(协议):通常为 0,可用于标识域和类型下的协议变体。 |
| 4 | hostname(主机名):网络接口标识符:
|
| 5 | port(端口):服务器监听客户端调用的端口,可以是整数端口号、包含端口号的字符串、服务名。 |
socket 模块
创建 Socket 使用 socket.socket() 函数,语法:
s = socket.socket(socket_family, socket_type, protocol=0)
参数说明:
- socket_family:
AF_UNIX或AF_INET。 - socket_type:
SOCK_STREAM或SOCK_DGRAM。 - protocol:通常省略,默认 0。
获得 Socket 对象后,可调用相关函数创建客户端/服务端程序。常用方法分类如下:
服务端 Socket 方法
| 序号 | 方法及说明 |
|---|---|
| 1 | s.bind():绑定地址(主机名、端口对)到 Socket。 |
| 2 | s.listen():启动 TCP 监听器。 |
| 3 | s.accept():被动接受 TCP 客户端连接,阻塞直到连接到达。 |
客户端 Socket 方法
| 序号 | 方法及说明 |
|---|---|
| 1 | s.connect():主动发起 TCP 服务器连接。 |
通用 Socket 方法
| 序号 | 方法及说明 |
|---|---|
| 1 | s.recv():接收 TCP 消息。 |
| 2 | s.send():发送 TCP 消息。 |
| 3 | s.recvfrom():接收 UDP 消息。 |
| 4 | s.sendto():发送 UDP 消息。 |
| 5 | s.close():关闭 Socket。 |
| 6 | socket.gethostname():返回主机名。 |
简单服务端
使用 socket 模块的 socket 函数创建 Socket 对象,调用其他函数建立服务器。调用 bind(hostname, port) 指定服务端口,再调用 accept 等待客户端连接,返回代表该连接的 connection 对象。
#!/usr/bin/python
# server.py
import socket
s = socket.socket()
host = socket.gethostname()
port = 12345
s.bind((host, port))
s.listen(5)
while True:
c, addr = s.accept()
print('Got connection from', addr)
c.send('Thank you for connecting')
c.close()
简单客户端
创建 Socket 客户端连接指定主机和端口 12345。socket.connect(hostname, port) 打开 TCP 连接。打开后可像 IO 对象一样读取,用完需关闭。
#!/usr/bin/python
# client.py
import socket
s = socket.socket()
host = socket.gethostname()
port = 12345
s.connect((host, port))
print(s.recv(1024))
s.close()
后台运行 server.py 再运行 client.py:
$ python server.py &
$ python client.py
结果:
Got connection from ('127.0.0.1', 48437)
Thank you for connecting
Python 互联网模块
网络/互联网编程重要模块一览:
| 协议 | 常见功能 | 端口 | Python 模块 |
|---|---|---|---|
| HTTP | 网页 | 80 | httplib, urllib, xmlrpclib |
| NNTP | Usenet 新闻 | 119 | nntplib |
| FTP | 文件传输 | 20 | ftplib, urllib |
| SMTP | 发送邮件 | 25 | smtplib |
| POP3 | 接收邮件 | 110 | poplib |
| IMAP4 | 接收邮件 | 143 | imaplib |
| Telnet | 命令行 | 23 | telnetlib |
| Gopher | 文档传输 | 70 | gopherlib, urllib |
请查阅上述库以使用 FTP、SMTP、POP、IMAP 等协议。
延伸阅读
这是 Socket 编程快速入门,主题广泛。建议参考:
- Unix Socket Programming。
- Python Socket Library and Modules。
Python
- 精通Python数据类型:实战指南
- 精通Python运算符:全面指南
- 精通Python Pass语句:实战指南
- 精通Python函数参数:位置、关键字与默认参数
- 精通 Python 字典:创建、操作与进阶技巧
- 精通 Python 面向对象编程:类、继承、封装与多态
- 精通 Python 迭代器:工作原理与自定义构建
- Python 闭包详解:嵌套函数如何捕获变量
- 精通 Python datetime:日期、时间与时区实战指南
- 精通 Python time.sleep():最佳实践、多线程与实战案例
- Python 多线程编程精通:高效并发技术全解析
- Python C 扩展开发指南:构建高性能原生模块