Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1407996
  • 博文数量: 247
  • 博客积分: 10147
  • 博客等级: 上将
  • 技术积分: 2776
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-24 15:18
文章分类

全部博文(247)

文章存档

2013年(11)

2012年(3)

2011年(20)

2010年(35)

2009年(91)

2008年(87)

我的朋友

分类: Python/Ruby

2009-12-21 19:46:59

基本的 Python socket 模块

Python 提供了两个基本的 socket 模块。第一个是 Socket,它提供了标准的 BSD Sockets API。第二个是 ,它提供了服务器中心类,可以简化网络服务器的开发。Python 使用一种异步的方式来实现这种功能,您可以提供一些插件类来处理服务器中应用程序特有的任务。表 1 列出了本节所涉及的类和模块。

  • 表1. Python 类和模块

类/模块

说明

Socket

低层网络接口(每个 BSD API)

提供简化网络服务器开发的类

让我们来看一下这些模块,以便理解它们是如何工作的。

socket 模块

Socket 模块提供了 UNIX 程序员所熟悉的基本网络服务(也称为 BSD API)。这个模块中提供了在构建 socket 服务器和客户机时所需要的所有功能。

这个 API 与标准的 C API 之间的区别在于它是面向对象的。在C中,socket描述符是从socket调用中获得的,然后会作为一个参数传递给BSD API函数。在Python中,socket 方法会向应用socket方法的对象返回一个socket对象。表2给出了几个类方法,表3显示了一部分实例方法。

  • 表2. Socket 模块的类方法

类方法

说明

Socket

低层网络接口(每个 BSD API)

socket.socket(family, type)

创建并返回一个新的 socket 对象

socket.getfqdn(name)

将使用点号分隔的 IP 地址字符串转换成一个完整的域名

socket.gethostbyname(hostname)

将主机名解析为一个使用点号分隔的 IP 地址字符串

socket.fromfd(fd, family, type)

从现有的文件描述符创建一个 socket 对象

  • 表3. Socket 模块的实例方法

实例方法

说明

sock.bind( (adrs, port) )

将 socket 绑定到一个地址和端口上

sock.accept()

返回一个客户机 socket(带有客户机端的地址信息)

sock.listen(backlog)

将 socket 设置成监听模式,能够监听 backlog 外来的连接请求

sock.connect( (adrs, port) )

将 socket 连接到定义的主机和端口上

sock.recv( buflen[, flags] )

从 socket 中接收数据,最多 buflen 个字符

sock.recvfrom( buflen[, flags] )

从 socket 中接收数据,最多 buflen 个字符,同时返回数据来源的远程主机和端口号

sock.send( data[, flags] )

通过 socket 发送数据

sock.sendto( data[, flags], addr )

通过 socket 发送数据

sock.close()

关闭 socket

sock.getsockopt( lvl, optname )

获得指定 socket 选项的值

sock.setsockopt( lvl, optname, val )

设置指定 socket 选项的值

类方法和实例方法之间的区别在于,实例方法需要有一个socket实例(从socket返回)才能执行,而类方法则不需要。

SocketServer 模块

模块是一个十分有用的模块,它可以简化socket服务器的开发。有关这个模块的使用的讨论已经远远超出了本教程的范围,但是我将展示一下它的基本用法,然后您可以参阅参考资料一节中给出的链接。

考虑清单 2 中给出的例子。此处,我们实现了一个简单的 “Hello World” 服务器,当客户机连接它时,它就会显示这样一条消息。我首先创建一个请求处理程序,它继承了 . 类。我们定义了一个名为 handle 的方法,它处理服务器的请求。服务器所做的每件事情都必须在这个函数的上下文中进行处理(最后,关闭这个 socket)。这个过程的工作方式非常简单,但是您可以使用这个类来实现一个简单的 HTTP 服务器。在 handle 方法中,我们打一个招呼就退出了。

现在连接处理程序已经准备就绪了,剩下的工作是创建 socket 服务器。我们使用了 .TCPServer 类,并提供了地址和端口号(要将服务器绑定到哪个端口上)以及请求处理方法。结果是一个 TCPServer 对象。调用 serve_forever 方法启动服务器,并使其对这个连接可用。

  • 清单 2. 用 模块实现一个简单的服务器

 1 import SocketServer
2
3 class hwRequestHandler( SocketServer.StreamRequestHandler ):
4 def handle( self ):
5 self.wfile.write("Hello World!\n")
6
7
8 server = SocketServer.TCPServer( ("", 2525), hwRequestHandler )
9 server.serve_forever()

就是这样!Python 允许这种机制的任何变种,包括 UDPServers 以及派生进程和线程的服务器。请参阅 参考资料一节中更多信息的链接。

阅读(2981) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~