Python socket 模块
基本的 Python socket 模块
Python 提供了两个基本的 socket 模块。第一个是 Socket
,它提供了标准的 BSD Sockets API。第二个是 SocketServer
,它提供了服务器中心类,可以简化网络服务器的开发。Python 使用一种异步的方式来实现这种功能,您可以提供一些插件类来处理服务器中应用程序特有的任务。表 1 列出了本节所涉及的类和模块。
表 1. Python 类和模块
类/模块 | 说明 |
Socket | 低层网络接口(每个 BSD API) |
SocketServer | 提供简化网络服务器开发的类 |
让我们来看一下这些模块,以便理解它们是如何工作的。
Socket 模块
Socket
模块提供了 UNIX® 程序员所熟悉的基本网络服务(也称为 BSD API)。这个模块中提供了在构建 socket 服务器和客户机时所需要的所有功能。
这个 API 与标准的 C API 之间的区别在于它是面向对象的。在 C 中,socket 描述符是从 socket 调用中获得的,然后会作为一个参数传递给 BSD API 函数。在 Python 中,socket
方法会向应用 socket 方法的对象返回一个 socket 对象。表 2 给出了几个类方法,表 3 显示了一部分实例方法。
表 2. Socket 模块的类方法
类方法 | 说明 |
| 低层网络接口(每个 BSD API) |
| 创建并返回一个新的 socket 对象 |
| 将使用点号分隔的 IP 地址字符串转换成一个完整的域名 |
| 将主机名解析为一个使用点号分隔的 IP 地址字符串 |
| 从现有的文件描述符创建一个 socket 对象 |
表 3. Socket 模块的实例方法
实例方法 | 说明 |
| 将 socket 绑定到一个地址和端口上 |
| 返回一个客户机 socket(带有客户机端的地址信息) |
| 将 socket 设置成监听模式,能够监听 backlog 外来的连接请求 |
| 将 socket 连接到定义的主机和端口上 |
| 从 socket 中接收数据,最多 |
| 从 socket 中接收数据,最多 |
| 通过 socket 发送数据 |
| 通过 socket 发送数据 |
| 关闭 socket |
| 获得指定 socket 选项的值 |
| 设置指定 socket 选项的值 |
类方法 和 实例方法 之间的区别在于,实例方法需要有一个 socket 实例(从 socket 返回)才能执行,而类方法则不需要。
SocketServer 模块
SocketServer
模块是一个十分有用的模块,它可以简化 socket 服务器的开发。有关这个模块的使用的讨论已经远远超出了本教程的范围,但是我将展示一下它的基本用法,然后您可以参阅 参考资料 一节中给出的链接。
考虑清单 2 中给出的例子。此处,我们实现了一个简单的 “Hello World” 服务器,当客户机连接它时,它就会显示这样一条消息。我首先创建一个请求处理程序,它继承了 SocketServer.StreamRequestHandler
类。我们定义了一个名为 handle
的方法,它处理服务器的请求。服务器所做的每件事情都必须在这个函数的上下文中进行处理(最后,关闭这个 socket)。这个过程的工作方式非常简单,但是您可以使用这个类来实现一个简单的 HTTP 服务器。在 handle
方法中,我们打一个招呼就退出了。
现在连接处理程序已经准备就绪了,剩下的工作是创建 socket 服务器。我们使用了 SocketServer.TCPServer
类,并提供了地址和端口号(要将服务器绑定到哪个端口上)以及请求处理方法。结果是一个 TCPServer
对象。调用 serve_forever
方法启动服务器,并使其对这个连接可用。
清单 2. 用 SocketServer 模块实现一个简单的服务器
|
就是这样!Python 允许这种机制的任何变种,包括 UDPServers
以及派生进程和线程的服务器。