第十章 网络基础 – Socket编程

Python Alan 5年前 (2019-03-02) 9702次浏览 0个评论 扫描二维码

精通Python自动化脚本-运维人员宝典完整目录:

第一章 Python脚本概述
第二章 Python脚本调试和性能测试
第三章 单元测试-单元测试框架的介绍
第四章 自动化常规运维活动
第五章 文件、目录和数据处理
第六章 文件存档、加密和解密
第七章 文本处理和正则表达式
第八章 文档和报告
第九章 操作各类文件
第十章 网络基础 – Socket编程
第十一章 使用Python脚本处理邮件
第十二章 使用Telnet和SSH远程监控主机
第十三章 创建图形化用户界面
第十四章 处理Apache和其它的日志文件
第十五章 SOAP和REST API通讯
第十六章 网络抓取 – 从网站上提取有用的信息
第十七章 数据收集及报表
第十八章 MySQL和SQLite数据库管理

 

本章中我们将学习sockets和三种互联网协议:http, ftplib和urllib。我们会学习Python中用于网络的socket模块。http是一个用于处理超文本传输协议的包。ftplib用于执行自动化的FTP相关工作。urllib是一个处理URL相关工作的包。

本章中我们将学习如下内容:

  • Sockets
  • http包
  • ftplib模块
  • urllib包

Socket接口

这一部分中, 我们将学习socket(套接字接口)的知识。我们将使用Python的socket模块。socket是本地或远程机器间通过的端点(endpoint)。socket模块有一个socket类,用于处理数据通道。它还包含网络相关操作的函数。要使用socket模块的功能,首先我们要导入socket模块。

我们来看看如何创建一个socket。socket类有一个socket函数,带有两个参数:address_family和socket类型。

语法如下:

address_family控制OSI(Open System Interconnection 开放式系统互联)网络分层协议

socket type控制传输层协议

Python支持三种地址类型:AF_INET, AF_INET6和AF_UNIX。最常用的为AF_INET,用于因特网寻址。AF_INET6用于IPv6因特网寻址。AF_UNIX用于Unix域套接字(Unix Domain Sockets – UDS),是一种跨进程通讯协议。

有两种socket类型:SOCK_DGRAM和SOCK_STREAM。SOCK_DGRAM套接字类型用于面向消息的datagram传输,这些与UDP协议相关联。datagram套接字投递单个消息。SOCK_STREAM处理面向数据流的传输,与TCP协议相关联。流套接字接口在客户端和服务器端之间提供字节流。

socket可配置为服务端和客户端接口。在TCP/IP套接字接口都连接时,通讯是双向的。下面我们来探讨一个客户端-服务端通讯的示例。我们会创建两个脚本文件:server.py和client.py。

server.py脚本内容如下:

下面我们来编写客户端脚本。client.py脚本内容如下:

下面我们要在两个不同的终端中运行这两个程序。第一个终端中运行server.py,在第二个终端中运行client.py。

输出结果如下:

第十章 网络基础 - Socket编程

http包

这部分中,我们将学习http包相关知识。http包有四个模块:

  • http.client: 这是一个底层HTTP协议客户端
  • http.server: 包含基本HTTP服务器类
  • http.cookies: 用于实现带cookie的状态管理
  • http.cookiejar: 该模块提供cookie持久化

这一部分中,我们将学习http.client和http.server模块。

http.client模块

我们将来看两种http请求:GET和POST。我们还会来做一个http连接。

首先,我们来探讨一个进行http连接的示例。为此创建一个脚本make_connection.py并在其中编写如下内容:

运行脚本,我们将会得到如下输出:

在上例中,我们对传入的 URL 的80端口以一个指定的超时时间进行了连接。

下面我们来看 http GET请求方法,使用GET请求方法我们可以看一个获取返回码以及头部列表的示例。创建一个脚本get_example.py并编写如下内容:

运行脚本如下:

得到的结果如下:

上例中,我们使用了HTTPSConnection,因为该网站以HTTPS协议提供服务。我们根据网站的具体情况可以使用HTTPSConnection或HTTPConnection。我们传入了一个 URL 并通过连接对象查看了其状态。然后,我们获取到了一个header列表。该header列表中包含服务器返回数据类型的相关信息。getheaders() 方法可获取到header列表。

下面我们来看一个POST请求的示例。我们可以使用HTTP POST来向URL post数据。下面创建一个脚本post_example.py并编写如下内容:

运行脚本如下:

我们将得到如下的输出:

上例中,首先我们创建了一个HTTPSConnection对象。然后,我们创建了一个post_text对象,它post 了Hello World。再后,我们编写了一个POST请求,并接收到了响应信息。

http.server模块

这一部分中,我们将学习http包中的一个模块:http.server模块。该模块定义用于实现HTTP服务端的类。它有两个方法:GET和HEAD。通过使用该模块,我们可以在网络上分享文件。我们可以在任意端口上运行http服务端。确保该端口号大于1024。默认端口号为8000。

可像下面这样使用http.server。

首先进行到选定的目录,并运行如下命令:

这时打开浏览器,在地址栏中键入localhost:9000并按下Enter键。将会得到如下输出:

译者注:纯命令行服务器可通过 curl localhost:9000进行访问,或通过服务器 IP 地址来进行访问,以示 Alan 演示了这两种效果

ftplib模块

ftplibj在Python中提供了包含所有FTP协议各类操作的功能。ftplib包含FTP客户端类,以及一些帮助函数。使用该模块我们可以很容易地连接FTP服务器来获取多个文件并对它们进行处理。通过导入ftplib模块,我们就可以使用其中的所有功能了。

这一部分中,我们将讲解如何使用ftplib模块来进行FTP传输。我们会一起来看各类FTP对象。

下载文件

这一部分中,我们将学习使用ftplib从另一台机器上下载文件。为此,创建一个get_ftp_files.py脚本并编写如下内容:

运行脚本如下:

得到的结果如下:

译者注:要实现以上,首先要确保存在相关文件和目录并安装了 ftp 服务:sudo apt-get install vsftpdu并对/etc/vsftpd.conf进行相应的配置。

上例中,我们使用ftplib模块从主机上获取了多个文件。首先,我们传入了另一台机器的IP地址、用户名和密码。要从主机上获取所有文件,我们使用了ftp.nlst() 函数,并使用ftp.retrbinary()函数将这些文件下载到了本地电脑。

使用getwelcome()获取欢迎信息

一旦建立了初始化连接,服务端通常会返回一条欢迎信息。这一消息来自getwelcome()函数,有时会包含声明信息以及与可能与用户相关的帮助信息。

下面我们来看一个getwelcome()的示例,创建一个脚本get_welcome_msg.py并编写如下内容:

运行脚本如下:

以上代码中,首先我们传入了另一台机器的IP地址、用户名和密码。我们使用了getwelcome()函数来获取初始化连接建立之后的信息。

使用sendcmd()函数向服务器发送命令

这一部分中,我们将学习sendcmd()函数。我们可以使用sendcmd()来发送一个简单字符串命令来获取字符串响应。客户端可以发送STAT, PWD, RETR和STOR等FTP命令。ftplib模块中有多个方法能封装这些命令。这些命令可使用sendcmd()或voidcmd()方法进行发送。作为示例,我们将发送一个STAT命令来查看服务端的状态。

创建一个脚本send_command.py并编写如下内容:

运行脚本如下:

将得到如下输出:

以上代码中,我们首先传入了另一台机器的IP地址、用户名和密码。接着,我们使用了sendcmd()向另一台机器发送了STAT命令。然后使用sendcmd()发送PWD命令。

urllib包

和http相似,urllib也是包含处理 URL 的诸多模块的一个包。urllib模块允许我们通过脚本访问多个网站。我们可以使用这个模块来下载数据、解决数据、修改header等。

urllib有几个不同的模块,列出如下:

  • urllib.request: 用于打开和读取URL
  • urllib.error: 包含urllib.request抛出的异常
  • urllib.parse: 用于解析URL
  • urllib.robotparser: 用于解析robots.txt文件

这一部分中,我们将学习使用urllib来打开URL以及如何从URL读取html文件。我们会看一个urllib用法的简单示例。我们将导入urllib.requests。然后将打开的 URL 分配给一个变量,再后,我们会使用a .read()命令来从URL读取数据。

创建脚本url_requests_example.py并在其中编写如下内容:

运行脚本如下:

得到的结果如下:

上例中,我们使用了read()方法,它返回一个字节数组。这会以不易于人类阅读的格式打印Imdb首页返回的数据,但我们可以使用HTML解析器来从中提取有用的信息。

Python urllib响应头

我们可以对响应对象调用 info()函数来获取响应头。它返回一个字典,这样我们还可以从响应中提取指定的头信息数据。创建一个脚本url_response_header.py并编写如下内容:

运行脚本如下:

输出如下:

总结

本章中,我们学习了socket,它用于服务端-客户端双向通讯。我们还学习了三个互联网模块:http, ftplib和urllib。http包中有服务端和客户端模块:分别为http.client和http.server。使用ftplib,我们从另一台机器上下载了文件。我们还看了欢迎消息的知识以及发送send命令。

下一章中将涵盖创建和发送邮件的知识。我们会学习消息格式以及添加多媒体内容。同时,我们会学习SMTP, POP和IMAP服务器。

课后问题

  1.  什么是socket编程?
  2. 什么是RPC?
  3. 导入用户定义的模块或文件有哪些不同的方式?
  4. 列表和元组之间的区别是什么?
  5. 字典中的键是否可以重复?
  6. urllib, urllib2和requests模块之间的区别是什么?

扩展阅读

喜欢 (1)
[]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址