Socket编程

本教程将向您介绍如何使用 Python 开发基于 socket 的网络应用程序。在本教程中,您将首先学习一些 Python 的基础知识,并了解 Python 是如何成为一种很好的网络编程语言的。然后您将着重了解 Python 的基本 socket 特性,我们使用了一个样例聊天程序作为参考;并了解一下可以提供异步通信的其他高级类。

1. 开始之前

1.1. 关于本教程

Python 是一个流行的面向对象的脚本语言,其语法非常简单,有大量的开发人员采用它。它是一种通用的语言,可以在各种环境中使用。它也是初学者常用的一种语言,就像是 20 世纪 70 年代的 BASIC 一样。

本教程重点介绍了 Python 语言在网络编程方面的知识。我定义了 Python 的一些基本 socket 特性,以及可以提供异步 socket 的另外一些高级类。我还详细介绍了 Python 的应用层协议类,展示了如何构建 Web 客户机、邮件服务器和客户机等等。

在本教程中我们还开发了一个简单的聊天服务器,从而展示 Python 在 socket 应用程序方面的强大功能。

您应该对标准的 BSD socket API 有基本的了解,并且具有使用 GNU/Linux® 环境的经验。如果熟悉面向对象的概念会很有帮助。

1.2. 前提条件

本教程以及本教程中所展示的例子使用的都是 2.4 版本的 Python。可以从 Python Web 站点上下载这个版本(请参阅 参考资料 中的链接)。要编译 Python 解释器,需要使用 GNU C 编译器(gcc)和 configure/make 工具(任何标准的 GNU/Linux 发行版中都包含这个工具)。

您应该对标准的 BSD Sockets API 有基本的了解,并且具有使用 GNU/Linux 环境的经验。如果熟悉面向对象的概念将会很有帮助。

2. Python 简介

首先,让我们来体验一下 Python。

2.1. 什么是 Python?

Python 是一种通用的面向对象脚本语言,可以在各种平台上使用。Python 是在 20 世纪 90 年代在 Amsterdam 的 CWI 诞生的,目前由 Python 软件基金会进行资助。

Python 具有迷人的可移植特性,几乎在所有操作系统上都可以找到它。

Python 是一种解释性的语言,很容易进行扩展。可以使用 C 或 C++ 函数通过添加包含函数、变量和类型的新模块来对 Python 进行扩展。

也可以在 C 或 C++ 程序中非常方便地嵌入 Python 程序,这样就可以对应用程序进行扩展,使其具有脚本的功能。

Python 最有用的一点是它具有大量的扩展模块。这些模块提供了一些标准的功能,例如字符串或列表处理;还有一些应用级的模块,用来进行视频和图像处理、声音处理和网络处理。

2.2. 体验 Python

下面我们先对 Python 是什么建立一个直观印象。

作为一种解释性语言,Python 很容易使用,并且能够快速验证我们的想法和开发原型软件。Python 程序可以作为一个整体进行解释,也可以一行行地解释。

可以在第一次运行 Python 时测试一下下面的 Python 代码,然后一次只输入一行试试。在 Python 启动之后,会显示一个提示符(>>>),可以在这里输入命令。 注意在 Python 中,缩进非常重要,因此代码前面的空格不能忽略:

   1 # 可以试验的几个 Python 例子
   2 
   3 # Open a file, read each line, and print it out
   4 for line in open('file.txt'):
   5   print line
   6 
   7 
   8 # Create a file and write to it
   9 file = open("test.txt", "w")
  10 file.write("test line\n")
  11 file.close()
  12 
  13 
  14 # Create a small dictionary of names and ages and manipulate
  15 family = {'Megan': 13, 'Elise': 8, 'Marc': 6}
  16 
  17 # results in 8
  18 family['Elise']
  19 
  20 # Remove the key/value pair
  21 del family['Elise']
  22 
  23 
  24 # Create a list and a function that doubles its input.  Map the
  25 #    function to each of the elements of the list (creating a new
  26 #    list as a result).
  27 arr = [1, 2, 3, 4, 5]
  28 def double(x): return x*x
  29 map(double, arr)
  30 
  31 
  32 # Create a class, inherit by another, and then instantiate it and
  33 #    invoke its methods.
  34 class Simple:
  35   def __init__(self, name):
  36     self.name = name
  37 
  38   def hello(self):
  39     print self.name+" says hi."
  40 
  41 class Simple2(Simple):
  42   def goodbye(self):
  43     print self.name+" says goodbye."
  44 
  45 me = Simple2("Tim")
  46 me.hello()
  47 me.goodbye()

2.3. 为什么使用 Python?

我们要学习和使用 Python 的一个原因是它非常流行。Python 用户的数量以及使用 Python 编写的应用程序的不断增长使这种努力是值得的。

在很多开发领域中都可以看到 Python 的踪迹,它被用来构建系统工具,用作程序集成的黏合剂,用来开发 Internet 应用程序和快速开发原型。

Python 与其他脚本语言相比也有一定的优势。它的语法非常简单,概念非常清晰,这使得 Python 非常容易学习。在使用复杂的数据结构(例如列表、词典和元组)时,Python 也非常简单,而且可描述性更好。Python 还可以对语言进行扩充,也可以由其他语言进行扩充。

我发现 Python 的语法使它比 Perl 的可读性和可维护性更好,但是比 Ruby 要差。与 Ruby 相比,Python 的优点在于它有大量的库和模块可以使用。使用这些库和模块,只需要很少的代码就可以开发功能丰富的程序。

Python 使用缩进格式来判断代码的作用域,这有些讨厌,但是 Python 本身的简单性使这个问题已经微不足道了。

现在,让我们开始进入 Python 中的 socket 编程世界。

多线程

ch3n2k.com | Copyright (c) 2004-2020 czk.