12、Python程序作为网络客户端

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 模块中的所有资源。然后创建一个套接字实例来接收消息。以下是具体的步骤:

  1. 导入 socket 模块。
  2. 创建一个UDP套接字。
  3. 设置目标地址。
  4. 进入无限循环,每隔两秒发送一条消息。
# 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使用等。这些知识和技术为编写高效的网络客户端程序提供了坚实的基础。未来,随着互联网的发展,网络编程将继续发挥重要作用,掌握这些技能将为开发者带来更多机会和挑战。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值