Python高级编程与实践:Python网络编程基础与实践

Python网络编程实战:从Socket到Requests

学习目标

通过本课程,学员将深入了解Python中的网络编程基础,掌握使用socket库进行基本的网络通信,以及如何利用requests库发送HTTP请求。通过本课程的学习,学员将能够构建简单的网络应用程序,并理解网络编程的基本原理。

相关知识点

Python网络编程实战

学习内容

1 Python网络编程实战

1.1 使用socket库进行网络通信
1.1.1 理解Socket编程基础

在Python中,socket库提供了访问底层网络接口的方法,使得开发者能够创建网络应用程序。Socket编程是网络编程的基础,它允许程序之间通过网络进行通信。在本节中,我们将学习如何使用Python的socket库创建一个简单的客户端-服务器模型。

理论知识:

  • Socket类型:在Python中,主要使用两种类型的Socket,TCP(传输控制协议)和UDP(用户数据报协议)。TCP是一种面向连接的协议,提供可靠的数据传输服务;而UDP是一种无连接的协议,提供不可靠但快速的数据传输服务。
  • Socket地址:每个Socket都有一个地址,通常由IP地址和端口号组成。IP地址用于标识网络中的设备,端口号用于标识设备上的应用程序。
  • Socket方法:socket库提供了多种方法来创建和管理Socket,包括socket()、bind()、listen()、accept()、connect()、send()、recv()等。

实践代码: 下面是一个简单的TCP服务器和客户端的示例代码,展示了如何使用socket库进行基本的网络通信。

服务器端代码:

python 复制代码
import socket

# 创建一个TCP/IP socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定socket到本地地址和端口
server_address = ('localhost', 10000)
server_socket.bind(server_address)

# 监听传入连接
server_socket.listen(1)

print('等待连接...')
connection, client_address = server_socket.accept()
print(f'连接来自: {client_address}')

try:
    while True:
        data = connection.recv(1024)
        print(f'收到数据: {data.decode()}')
        if data:
            response = f'收到: {data.decode()}'
            connection.sendall(response.encode())
        else:
            print('没有数据,关闭连接')
            break
finally:
    # 清理连接
    connection.close()
    server_socket.close()

客户端代码:

python 复制代码
import socket

# 创建一个TCP/IP socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 连接到服务器
server_address = ('localhost', 10000)
client_socket.connect(server_address)

try:
    message = '你好,服务器!'
    print(f'发送: {message}')
    client_socket.sendall(message.encode())

    # 接收响应
    response = client_socket.recv(1024)
    print(f'收到响应: {response.decode()}')
finally:
    # 清理连接
    client_socket.close()
1.1.2 实践:构建一个简单的聊天应用

在理解了基本的Socket编程之后,我们可以尝试构建一个简单的聊天应用。这个应用将包括一个服务器和多个客户端,客户端可以向服务器发送消息,服务器将消息广播给所有连接的客户端。

服务器端代码:

python 复制代码
import socket
import threading

# 创建一个TCP/IP socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定socket到本地地址和端口
server_address = ('localhost', 10001)
server_socket.bind(server_address)

# 监听传入连接
server_socket.listen(5)
print('等待连接...')

# 存储所有连接的客户端
clients = []

def broadcast(message, sender):
    for client in clients:
        if client != sender:
            client.sendall(message.encode())

def handle_client(client_socket, client_address):
    while True:
        try:
            data = client_socket.recv(1024)
            if data:
                print(f'收到数据: {data.decode()}')
                broadcast(data.decode(), client_socket)
            else:
                print(f'客户端 {client_address} 断开连接')
                clients.remove(client_socket)
                client_socket.close()
                break
        except:
            continue

while True:
    client_socket, client_address = server_socket.accept()
    print(f'连接来自: {client_address}')
    clients.append(client_socket)
    client_thread = threading.Thread(target=handle_client, args=(client_socket, client_address))
    client_thread.start()

客户端代码:

python 复制代码
import socket
import threading

# 创建一个TCP/IP socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 连接到服务器
server_address = ('localhost', 10001)
client_socket.connect(server_address)

def receive_messages():
    while True:
        try:
            message = client_socket.recv(1024).decode()
            print(message)
        except:
            print('连接断开')
            client_socket.close()
            break

def send_messages():
    while True:
        message = input()
        client_socket.sendall(message.encode())

receive_thread = threading.Thread(target=receive_messages)
send_thread = threading.Thread(target=send_messages)

receive_thread.start()
send_thread.start()
1.2 使用requests库发送HTTP请求

理解HTTP请求。 HTTP(超文本传输协议)是互联网上应用最为广泛的一种网络协议。requests库是Python中一个非常流行的HTTP库,它使得发送HTTP请求变得非常简单。在本节中,我们将学习如何使用requests库发送GET和POST请求,并处理响应。

理论知识:

  • HTTP方法:HTTP定义了多种请求方法,最常用的是GET和POST。GET请求用于从服务器获取资源,POST请求用于向服务器发送数据。
  • 响应状态码:HTTP响应包含一个状态码,用于表示请求的结果。常见的状态码包括200(成功)、404(未找到)和500(服务器内部错误)。
  • 请求头和响应头:请求头和响应头包含了一些额外的信息,如内容类型、编码方式等。

实践代码: 下面是一个使用requests库发送GET和POST请求的示例代码。

发送GET请求:

python 复制代码
import requests

# 发送GET请求
response = requests.get('https://api.github.com')

# 检查响应状态码
if response.status_code == 200:
    print('请求成功')
    print('响应内容:', response.text)
else:
    print(f'请求失败,状态码: {response.status_code}')

发送POST请求:

python 复制代码
import requests

# 发送POST请求
data = {'key': 'value'}
response = requests.post('https://httpbin.org/post', data=data)

# 检查响应状态码
if response.status_code == 200:
    print('请求成功')
    print('响应内容:', response.json())
else:
    print(f'请求失败,状态码: {response.status_code}')
1.3 网络编程中的异常处理

理解异常处理的重要性。 在网络编程中,异常处理是非常重要的。网络通信可能会遇到各种问题,如网络中断、服务器不可达等。通过适当的异常处理,可以提高程序的健壮性和用户体验。

理论知识:

  • 常见的网络异常:常见的网络异常包括连接超时、连接中断、服务器返回错误状态码等。
  • 异常处理机制:Python提供了try-except语句来捕获和处理异常。通过捕获异常,可以避免程序因异常而崩溃,并提供友好的错误提示。

实践代码: 下面是一个使用requests库发送HTTP请求并处理异常的示例代码。

python 复制代码
import requests

try:
    # 发送GET请求
    response = requests.get('https://api.github.com', timeout=5)

    # 检查响应状态码
    if response.status_code == 200:
        print('请求成功')
        print('响应内容:', response.text)
    else:
        print(f'请求失败,状态码: {response.status_code}')
except requests.exceptions.Timeout:
    print('请求超时')
except requests.exceptions.ConnectionError:
    print('连接错误')
except requests.exceptions.HTTPError as e:
    print(f'HTTP错误: {e}')
except requests.exceptions.RequestException as e:
    print(f'请求错误: {e}')
相关推荐
卓豪终端管理几秒前
漏洞分析:90分钟安全革命
网络
Python×CATIA工业智造8 分钟前
Pycaita二次开发基础代码解析:参数化模板创建与设计表驱动建模
python·pycharm·pycatia
白应穷奇13 分钟前
编写高性能数据处理代码 01
后端·python
Entropy-Lee41 分钟前
JavaScript 执行上下文与作用域
开发语言·javascript·ecmascript
赴33542 分钟前
机器学习 集成学习之随机森林
人工智能·python·随机森林·机器学习·集成学习·sklearn·垃圾邮件判断
Hello.Reader1 小时前
Rust + WebAssembly 上线实战指南
开发语言·rust·wasm
Rust语言中文社区1 小时前
Rust 训练营二期来袭: Rust + AI 智能硬件
开发语言·后端·rust
站大爷IP1 小时前
掌握这五个Python核心知识点,编程效率翻倍!
python
Yang-Never1 小时前
Kotlin -> object声明和object表达式
android·java·开发语言·kotlin·android studio