Python程序作为网络客户端
1. 计算机网络基础
在深入探讨如何使用Python编写网络客户端之前,我们需要了解一些关于计算机网络的基础知识。这些知识将帮助我们更好地理解网络通信的工作原理,并为后续的编程实践打下坚实的基础。
1.1 网络通信的基本原理
网络通信的核心是通过某种物理媒介(如电线、无线电或光纤)传输数据信号。无论使用哪种媒介,基本原理都是硬件将数据以数字比特的形式置于媒介上,再由接收端的硬件将其恢复为原始数据。一个比特可以是0或1,表示为电压的存在与否、LED的光信号或无线电波。
例如,想象你在夜晚通过卧室的灯光向对面的朋友发送信号(图14-1)。你可以通过开灯和关灯来传递简单的信息。为了使通信更加有效,双方需要事先约定一个协议,规定如何解释这些信号。
graph LR;
A[你的卧室] --> B[开灯];
B --> C[关灯];
C --> D[对面朋友的卧室];
1.2 协议的作用
协议是通信双方事先约定的消息格式和响应规则。例如,你可以和朋友约定:“如果我关灯后再开两次,表示安全;如果我只开一次,表示不要来;如果我开三次,表示带披萨来。”这个协议可以确保双方正确理解和响应对方的信号。
协议和消息是独立的,我们可以改变信号的传输方式而不改变协议本身。例如,可以用敲水管或制造烟雾代替灯光信号,协议仍然有效。
2. 主机和端口
当我们想要在同一地址的不同设备之间发送消息时,需要改进我们的协议,以确保消息能够准确到达指定的接收者。在计算机系统中,一台服务器可以同时提供多种服务,如网页、视频流和多人游戏。不同的客户端需要一种方法来定位服务器上他们所需的服务。
2.1 端口的作用
互联网通过使用“端口”来实现这一功能。端口是一个数字,用于标识计算机提供的服务。一些端口是“众所周知”的,例如:
| 服务 | 端口号 |
|---|---|
| HTTP (网页) | 80 |
| HTTPS (加密网页) | 443 |
| FTP (文件传输) | 21 |
当浏览器连接到一个网页时,它使用服务器的IP地址找到实际的计算机,然后连接到端口80或443以获取网页。
2.2 端口和防火墙
程序员可以编写使用任何端口号的程序,但许多网络连接包含防火墙,只允许特定的、针对知名端口的包通过。这减少了网络上的系统遭受恶意程序攻击的风险。
3. 使用Python发送网络消息
现在我们已经了解了网络的基础功能,接下来可以看看如何使用Python编写程序来发送和接收网络消息。我们将使用User Datagram Protocol (UDP)来发送消息,这是一种简单但不可靠的协议,适用于不需要确认的消息传递。
3.1 发送和接收UDP消息
首先,我们需要导入
socket
模块中的所有资源。然后创建一个套接字实例来接收消息。以下是具体的步骤:
-
导入
socket模块。 - 创建一个UDP套接字。
- 设置目标地址。
- 进入无限循环,每隔两秒发送一条消息。
# EG14.02 Send packets on port 10001 to another machine
import socket
import time
# 设置目标IP地址
target_ip = '192.168.1.55'
# 创建UDP套接字
send_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 设置目标地址
destination_address = (target_ip, 10001)
# 进入无限循环,每隔两秒发送一条消息
while True:
print('Sending:')
send_socket.sendto(b'hello from me', destination_address)
time.sleep(2)
3.2 路由数据包
上述示例程序在我家中有效,因为我家中的两台电脑连接到了同一个家庭网络。然而,互联网上的计算机并不总是连接到同一个网络。互联网由大量独立的“本地”网络组成,这些网络相互连接。为了在不同网络之间传输消息,我们需要引入路由的概念。
路由类似于将消息从一个朋友传递给另一个朋友的过程(图14-3)。中间的朋友会读取消息的目标地址,并将其转发给正确的接收者。
graph LR;
A[你的家] --> B[中间朋友的家];
B --> C[远处朋友的家];
路由器是管理互联网连接的特殊计算机,负责将消息从一个网络转发到另一个网络。路由器还负责接收来自互联网的消息,并将其转发到本地网络中的正确计算机。
4. 数据报与连接
互联网提供了两种系统间交换信息的方式:数据报和连接。数据报是从一个系统发送到另一个系统的单条消息,而连接则是在两个系统之间建立的持续通信通道。
4.1 数据报的特点
数据报是无连接的,发送者和接收者之间不需要建立持久的连接。每个数据报都是独立的,发送后不会确认是否到达。UDP就是一个典型的数据报协议。
4.2 连接的特点
连接是可靠的,发送者和接收者之间建立了持久的通信通道。每次发送消息时,网络会确认消息是否成功传输,如果没有,则返回错误信息。TCP(传输控制协议)是典型的连接协议。
当确保整个消息完整无缺地传输变得至关重要时,就会使用连接。例如,当你的浏览器加载网页时,它会与网页服务器建立连接,确保网页的所有部分都被送达,并且任何失败的部分都会被重新传输。
5. 网络和地址
当我们使用Python程序发送和接收消息时,我们使用的是IP地址。IP地址是网络上特定计算机的“电话号码”。然而,没有人愿意记住复杂的IP地址,因此互联网上的计算机将连接到域名服务器(DNS),该服务器将主机名转换成IP地址。
5.1 IPv4和IPv6
IP地址有两种版本:IPv4和IPv6。IPv4使用32位地址,形式如192.168.1.55;IPv6使用128位地址,形式如2001:0db8:85a3:0000:0000:8a2e:0370:7334。
5.2 域名系统(DNS)
DNS是一系列服务器的集合,它们在自己之间传递命名请求,直到找到一个有权管理特定地址集的系统,该系统能够将名字与所需的地址匹配起来。
请继续阅读下半部分内容,我们将进一步探讨如何使用Python编写网络客户端程序,并介绍一些实际应用案例。
6. 使用Python消费网络内容
网页是使用互联网的众多服务之一。当浏览器想要读取一个网页时,它会建立一个与服务器的连接并请求页面内容。页面内容是用超文本标记语言(HTML)来表达的。页面内容可能包含对网页一部分的图片和声音的引用。浏览器将建立连接来下载这些内容,然后在屏幕上为你绘制页面。
6.1 阅读网页
我们可以使用Python编写程序来读取网页内容。虽然我们可以编写底层的基于套接字的代码来建立与Web服务器的TCP连接并获取数据,但Python的创作者已经为我们做了这项工作。
urllib
模块使用互联网连接与Web服务器通信,并为我们的程序获取网页。以下是读取网页的示例代码:
# EG14.03 Webpage reader
import urllib.request
url = 'https://www.robmiles.com'
req = urllib.request.urlopen(url)
for line in req:
print(line.decode('utf-8'))
如果你运行这个程序,它会打印出我博客页面的当前内容。
urlopen
对象使用HTTP请求网页,然后返回一个我们可以逐一处理的迭代器。每行内容需要解码为UTF-8格式以正确显示。
6.2 使用基于网络的数据
阅读网页的能力不仅限于加载网页的文本部分。我们还可以与许多其他数据服务进行交互。例如,RSS(Really Simple Syndication 或 Rich Site Summary)是一种描述网络文章或博客帖子的格式。许多网站提供其内容的RSS订阅源,程序可以连接并消费这些内容。
# EG14.04 RSS feed reader
import urllib.request
import xml.etree.ElementTree as ET
url = 'https://www.robmiles.com/journal/rss.xml'
req = urllib.request.urlopen(url)
tree = ET.parse(req)
root = tree.getroot()
for item in root.findall('.//item'):
title = item.find('title').text
link = item.find('link').text
print(f'Title: {title}\nLink: {link}\n')
这段代码读取RSS订阅源并解析XML文档,提取每个博客文章的标题和链接。
7. 网络编程中的常见问题
7.1 数据报能否保证到达?
UDP数据包是无连接的,不保证到达。相比之下,TCP数据包是会话的一部分,并保证到达。因此,选择合适的协议取决于应用场景。对于实时性要求不高但可靠性要求高的场景,如文件传输,应使用TCP。
7.2 XML和HTML的区别
XML和HTML都是标记语言。HTML是专门用于告诉网络浏览器如何显示网页的标记语言,而XML是一个标准,描述了如何制作任何类型的文档。XML可以设计用于保存足球比分、奶酪种类或其他任何你想操作和发送给其他计算机的内容。
| 特性 | XML | HTML |
|---|---|---|
| 用途 | 通用文档格式 | 网页格式 |
| 标签 | 用户自定义 | 固定标签集 |
| 内容 | 结构化数据 | 显示内容 |
7.3 HTML和HTTP的区别
HTML(超文本标记语言)告诉浏览器在屏幕上显示什么内容。HTTP(超文本传输协议)是服务器和浏览器之间传输页面数据(一个HTML文档)的方式。HTTP管理浏览器和服务器之间的通信,而HTML定义了网页的结构和内容。
8. 实际应用案例
8.1 获取天气信息
我们可以使用Python编写程序从天气服务器获取天气信息。以下是一个简单的示例,它下载并解析天气信息的XML文档:
# EG14.05 Weather information reader
import urllib.request
import xml.etree.ElementTree as ET
url = 'http://example.com/weather.xml'
req = urllib.request.urlopen(url)
tree = ET.parse(req)
root = tree.getroot()
for forecast in root.findall('.//forecast'):
date = forecast.find('date').text
high = forecast.find('high').text
low = forecast.find('low').text
print(f'Date: {date}, High: {high}°F, Low: {low}°F')
8.2 使用API
许多在线服务提供API(应用程序接口),允许开发者编写程序与其交互。例如,Twitter API允许开发者获取推文、发布推文等。使用API通常需要注册并获取API密钥。
# EG14.06 Twitter API example
import requests
api_key = 'your_api_key'
url = f'https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=twitter&count=5'
headers = {'Authorization': f'Bearer {api_key}'}
response = requests.get(url, headers=headers)
tweets = response.json()
for tweet in tweets:
print(tweet['text'])
9. 网络安全性
9.1 安全通信
为了防止网络窃听,现代浏览器和服务器使用加密技术来保护传输的数据。加密是将明文消息转换为只有接收者可以解密的数据。加密网站使用HTTPS协议(而非HTTP),并通过443端口连接,而不是80端口。
9.2 安全措施
- SSL/TLS :SSL(安全套接字层)和TLS(传输层安全)协议用于加密网络通信。
- HTTPS :使用HTTPS协议确保数据传输的安全性。
- 防火墙 :使用防火墙限制外部访问,防止未经授权的访问。
通过使用这些安全措施,我们可以确保网络通信的安全性和隐私性。
10. 总结与展望
通过本篇博客,我们深入了解了Python程序作为网络客户端的各个方面,包括计算机网络基础、UDP和TCP协议、DNS解析、网页读取、RSS订阅、天气信息获取和API使用等。这些知识和技术为编写高效的网络客户端程序提供了坚实的基础。未来,随着互联网的发展,网络编程将继续发挥重要作用,掌握这些技能将为开发者带来更多机会和挑战。
超级会员免费看
1146

被折叠的 条评论
为什么被折叠?



