Python网络编程攻略[试读]
1.1 简介
本章攻略: 打印设备名和IPv4地址 获取远程设备的IP地址 将IPv4地址转换成不同的格式 通过指定的端口和协议找到服务名 主机字节序和网络字节序之间相互转换 设定并获取默认的套接字超时时间 优雅地处理套接字错误 修改套接字发送和接收的缓冲区大小 把套接字改成阻塞或非阻塞模式 重用套接字地址 从网络时间服务器上获取并打印当前时间 编写一个SNTP客户端 编写一个简单的回显客户端/服务器应用 1.1 简介 本章通过一些简单的攻略介绍Python的核心网络库。Python的socket模块提供了类方法和实例方法,二... 查看全部[ 1.1 简介 ]
1.2 打印设备名和IPv4地址
有时,你需要快速查看设备的某些信息,例如主机名、IP地址和网络接口的数量等。这些信息使用Python脚本很容易获取。 1.2.1 准备工作 编写代码之前先要在设备上安装Python。大多数Linux发行版都预装了Python。如果使用微软Windows操作系统,可以从Python的网站上下载二进制文件:http://www.python.org/download/。 要了解系统是否已经安装了Python,可以查阅操作系统的文档。在设备上安装好Python之后,可以在命令行中输入python,尝试打开Python解释器。输入python后应该显示解释器提示符>>>,具体的... 查看全部[ 1.2 打印设备名和IPv4地址 ]
1.3 获取远程设备的IP地址
有时需要把设备的主机名转换成对应的IP地址,例如快速查询域名。本攻略介绍一个简单的函数来完成这一操作。 1.3.1 实战演练 如果想知道远程设备的IP地址,可以使用内置的库函数gethostbyname(),其参数是远程设备的主机名。 这里,我们要调用的是类函数gethostbyname()。让我们来看一下这个简短的代码片段。 代码清单1-2展示了如何获取远程设备的IP地址,如下所示: #!/usr/bin/env python # Python Network Programming Cookbook -- Chapter – 1 # This program is optim... 查看全部[ 1.3 获取远程设备的IP地址 ]
1.4 将IPv4地址转换成不同的格式
如果要使用低层网络函数,有时普通的字符串形式的IP地址并不是很有用,需要把它们转换成打包后的32位二进制格式。 1.4.1 实战演练 Python的socket库提供了很多用来处理不同IP地址格式的函数,这里我们使用其中的两个:inet_aton()和inet_ntoa()。 我们来定义convert_ip4_address()函数,调用inet_aton()和inet_ntoa()转换IP地址。我们要使用两个示例IP地址:127.0.0.1和192.168.0.1。 代码清单1-3展示了如何定义convert_ip4_address()函数,如下所示: #!/usr/bin/env... 查看全部[ 1.4 将IPv4地址转换成不同的格式 ]
1.5 通过指定的端口和协议找到服务名
如果想找到网络服务,最好知道该服务运行在TCP或UDP协议的哪个端口上。 1.5.1 准备工作 如果知道网络服务使用的端口,可以调用socket库中的getservbyport()函数来获取服务的名字。调用这个函数时可以根据情况决定是否提供协议名。 1.5.2 实战演练 我们来定义find_service_name()函数,在Python的for-in循环中调用函数getservbyport(),解析几个端口,例如80和25。 代码清单1-4展示了如何定义find_service_name()函数,如下所示: #!/usr/bin/env python # Python Netw... 查看全部[ 1.5 通过指定的端口和协议找到服务名 ]
1.6 主机字节序和网络字节序之间相互转换
编写低层网络应用时,或许需要处理通过电缆在两台设备之间传送的低层数据。在这种操作中,需要把主机操作系统发出的数据转换成网络格式,或者做逆向转换,因为这两种数据的表示方式不一样。 1.6.1 实战演练 Python的socket库提供了将数据在网络字节序和主机字节序之间相互转换的函数。你可能想了解这些函数,例如ntohl()和htonl()。 我们来定义convert_integer()函数,调用ntohl()和htonl()类函数来转换不同格式的数据。 代码清单1-5展示了如何定义convert_integer()函数,如下所示: #!/usr/bin/env python # P... 查看全部[ 1.6 主机字节序和网络字节序之间相互转换 ]
1.7 设定并获取默认的套接字超时时间
有时,你需要处理socket库某些属性的默认值,例如套接字超时时间。 1.7.1 实战演练 你可以创建一个套接字对象实例,调用gettimeout()方法获取默认的超时时间,调用settimeout()方法设定一个超时时间。这种操作在开发服务器应用时很有用。 在test_socket_timeout()函数中,首先创建一个套接字对象,然后使用读取或者设定实例方法处理超时时间。 代码清单1-6展示了如何定义test_socket_timeout()函数,如下所示: #!/usr/bin/env python # Python Network Programming Cookbook ... 查看全部[ 1.7 设定并获取默认的套接字超时时间 ]
1.8 优雅地处理套接字错误
在网络应用中,经常会遇到这种情况:一方尝试连接,但另一方由于网络媒介失效或者其他原因无法响应。Python的socket库提供了一个方法,能通过socket.error异常优雅地处理套接字错误。在这个攻略中会举几个例子。 1.8.1 实战演练 我们来编写几个try-except代码块,每个块对应一种可能发生的错误。为了获取用户输入,可以使用argparse模块。这个模块的功能很强大,而不仅是可以使用sys.argv解析命令行参数。这些try-except代码块分别演示了常见的套接字操作,例如创建套接字对象、连接服务器、发送数据和等待应答。 下述攻略使用几行代码演示了如何处理异常。 代码... 查看全部[ 1.8 优雅地处理套接字错误 ]
1.9 修改套接字发送和接收的缓冲区大小
很多情况下,默认的套接字缓冲区大小可能不够用。此时,可以将默认的套接字缓冲区大小改成一个更合适的值。 1.9.1 实战演练 我们要使用套接字对象的setsockopt()方法修改默认的套接字缓冲区大小。 首先,定义两个常量:SEND_BUF_SIZE和RECV_BUF_SIZE。然后在一个函数中调用套接字实例的setsockopt()方法。修改之前,最好先检查缓冲区大小是多少。注意,发送和接收的缓冲区大小要分开设定。 代码清单1-8展示了如何修改套接字的发送和接收缓冲区大小,如下所示: #!/usr/bin/env python # Python Network Programmi... 查看全部[ 1.9 修改套接字发送和接收的缓冲区大小 ]
1.10 把套接字改成阻塞或非阻塞模式
默认情况下,TCP套接字处于阻塞模式中。也就是说,除非完成了某项操作,否则不会把控制权交还给程序。例如,调用connect() API后,连接操作会阻止程序继续往下执行,直到连接成功为止。很多情况下,你并不想让程序一直等待服务器响应或者有异常终止操作。例如,如果编写了一个网页浏览器客户端连接服务器,你应该考虑提供取消功能,以便在操作过程中取消连接。这时就要把套接字设置为非阻塞模式。 1.10.1 实战演练 我们来看一下在Python中有哪些选项。在Python中,套接字可以被设置为阻塞模式或者非阻塞模式。在非阻塞模式中,调用API后,例如send()或recv()方法,如果遇到问题就会抛出... 查看全部[ 1.10 把套接字改成阻塞或非阻塞模式 ]
1.11 重用套接字地址
不管连接是被有意还是无意关闭,有时你想始终在同一个端口上运行套接字服务器。某些情况下,如果客户端程序需要一直连接指定的服务器端口,这么做就很有用,因为无需改变服务器端口。 1.11.1 实战演练 如果在某个端口上运行一个Python套接字服务器,连接一次之后便终止运行,就不能再使用这个端口了。如果再次连接,程序会抛出如下错误: Traceback (most recent call last): File "1_10_reuse_socket_address.py", line 40, in <module> reuse_socket_ad... 查看全部[ 1.11 重用套接字地址 ]
1.12 从网络时间服务器获取并打印当前时间
很多程序要求设备的时间精准,例如Unix系统中的make命令。设备上的时间可能不够准确,需要和网络中的时间服务器同步。 1.12.1 准备工作 你可以编写一个Python客户端,让设备上的时间和某个网络时间服务器同步。要完成这一操作,需要使用ntplib,通过“网络时间协议”(Network Time Protocol,简称NTP)处理客户端和服务器之间的通信。如果你的设备中没有安装ntplib,可以使用pip或easy_install从PyPI中安装,命令如下: $pip install ntplib 1.12.2 实战演练 我们先要创建一个NTPClient实例,然后在这个实例上... 查看全部[ 1.12 从网络时间服务器获取并打印当前时间 ]
1.13 编写一个SNTP客户端
与前一个攻略不同,有时并不需要从NTP服务器上获取精确的时间。遇到这种情况,就可以使用NTP的简化版本,叫作“简单网络时间协议”。 1.13.1 实战演练 让我们不使用任何第三方库编写一个简单的SNTP客户端。 首先,定义两个常量:NTP_SERVER和TIME1970。NTP_SERVER是客户端要连接的服务器地址,TIME1970指1970年1月1日(也叫Epoch)。在http://www.epochconverter.com/上可以查看Epoch时间值,或者把时间转换成Epoch时间值。这个客户端通过UDP协议创建一个UDP套接字(SOCK_DGRAM),用于连接服务器。然后,客... 查看全部[ 1.13 编写一个SNTP客户端 ]
1.14 编写一个简单的回显客户端/服务器应用
尝试过Python中socket模块的基本API后,现在我们来编写一个套接字服务器和客户端。这里,你将有机会利用在前述攻略中掌握的基本知识。 1.14.1 实战演练 在这个例子中,不管服务器从客户端收到什么输入,都会将其回显出来。我们要使用Python中的argparse模块,在命令行中指定TCP端口。服务器脚本和客户端脚本都要用到这个参数。 我们先来编写服务器。首先创建一个TCP套接字对象。然后设定启用重用地址,这样想运行多少次服务器就能运行多少次。我们把套接字绑定在本地设备的指定端口上。在监听阶段,把backlog参数传入listen()方法中,让服务器在队列中监听多个客户端。最后,... 查看全部[ 1.14 编写一个简单的回显客户端/服务器应用 ]
书名: Python网络编程攻略
作者: 萨卡尔
出版社: 人民邮电出版社
译者: 安道
出版年: 2014-12-1
页数: 170
定价: 45.00元
装帧: 平装
丛书: 图灵程序设计丛书
ISBN: 9787115372697