第11节 网络编程

在这一节中,我们将详细介绍 Python 中的网络编程。网络编程是现代应用程序中不可或缺的一部分,涉及到客户端和服务器之间的通信。我们将学习如何使用 Python 进行基本的网络编程,包括创建 TCP 和 UDP 服务器及客户端、使用 HTTP 请求以及处理网络数据。

11.1 基础知识

在网络编程中,常见的协议包括 TCP(传输控制协议)和 UDP(用户数据报协议)。TCP 是一种面向连接的协议,保证数据的可靠传输;UDP 是一种无连接的协议,适用于实时应用,但不保证数据的可靠性。

常用模块:

  • socket :用于低级别的网络通信。
  • http.client :用于发送 HTTP 请求。
  • requests :第三方库,简化 HTTP 请求的发送。

11.2 使用 socket 模块进行 TCP 编程

创建 TCP 服务器:

import socket

def start_tcp_server(host='127.0.0.1', port=65432):
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server_socket:
        server_socket.bind((host, port))
        server_socket.listen()
        print(f"Server listening on {host}:{port}")

        conn, addr = server_socket.accept()
        with conn:
            print(f"Connected by {addr}")
            while True:
                data = conn.recv(1024)
                if not data:
                    break
                conn.sendall(data)

if __name__ == "__main__":
    start_tcp_server()

创建 TCP 客户端:

import socket

def start_tcp_client(host='127.0.0.1', port=65432):
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as client_socket:
        client_socket.connect((host, port))
        client_socket.sendall(b'Hello, Server!')
        data = client_socket.recv(1024)
        print(f"Received: {data.decode()}")

if __name__ == "__main__":
    start_tcp_client()

11.3 使用 socket 模块进行 UDP 编程

创建 UDP 服务器:

import socket

def start_udp_server(host='127.0.0.1', port=65432):
    with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as server_socket:
        server_socket.bind((host, port))
        print(f"Server listening on {host}:{port}")

        while True:
            data, addr = server_socket.recvfrom(1024)
            print(f"Received from {addr}: {data.decode()}")
            server_socket.sendto(data, addr)

if __name__ == "__main__":
    start_udp_server()

创建 UDP 客户端:

import socket

def start_udp_client(host='127.0.0.1', port=65432):
    with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as client_socket:
        client_socket.sendto(b'Hello, Server!', (host, port))
        data, addr = client_socket.recvfrom(1024)
        print(f"Received: {data.decode()}")

if __name__ == "__main__":
    start_udp_client()

11.4 发送 HTTP 请求

使用 http.client 模块:

import http.client

def send_http_request():
    connection = http.client.HTTPConnection('www.example.com')
    connection.request('GET', '/')
    response = connection.getresponse()
    print(f"Status: {response.status} {response.reason}")
    print(response.read().decode())

if __name__ == "__main__":
    send_http_request()

使用 requests 库:

import requests

def send_http_request():
    response = requests.get('http://www.example.com')
    print(f"Status Code: {response.status_code}")
    print(f"Response Content: {response.text}")

if __name__ == "__main__":
    send_http_request()

11.5 处理网络数据

在网络编程中,经常需要处理接收到的数据。Python 提供了许多工具和库来帮助我们解析和处理数据。

JSON 数据处理:

import json

def handle_json_data():
    data = {
        "name": "Alice",
        "age": 25,
        "city": "New York"
    }
    json_data = json.dumps(data)
    print(f"JSON Data: {json_data}")

    parsed_data = json.loads(json_data)
    print(f"Parsed Data: {parsed_data}")

if __name__ == "__main__":
    handle_json_data()

XML 数据处理:

import xml.etree.ElementTree as ET

def handle_xml_data():
    xml_data = """
    <person>
        <name>Alice</name>
        <age>25</age>
        <city>New York</city>
    </person>
    """
    root = ET.fromstring(xml_data)
    name = root.find('name').text
    age = root.find('age').text
    city = root.find('city').text
    print(f"Name: {name}, Age: {age}, City: {city}")

if __name__ == "__main__":
    handle_xml_data()

小结

通过本节的学习,你应该已经掌握了 Python 中网络编程的基本概念和用法,包括使用 socket 模块进行 TCP 和 UDP 编程、发送 HTTP 请求以及处理网络数据。网络编程是现代应用程序中不可或缺的一部分,能够帮助你构建高效的网络服务和客户端。下一节我们将继续学习 Python 中的多线程和多进程编程。

本文由mdnice多平台发布


星火技术
1 声望0 粉丝