第九天 网络编程基础

Python网络编程涉及使用Python语言来开发网络通信相关的应用程序。这包括客户端和服务器端的开发,以及处理各种网络协议(如TCP/IP、UDP、HTTP等)。以下是一些Python网络编程的基础知识和示例代码。

1. 套接字(Sockets)

套接字是网络通信的基础。Python的socket模块提供了用于网络通信的底层接口。

TCP/IP 示例

服务器端(TCP Server)

python 复制代码
import socket

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

# 绑定服务器地址和端口
server_address = ('localhost', 65432)
server_socket.bind(server_address)

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

print(f"等待连接在 {server_address}")

while True:
    # 等待连接
    connection, client_address = server_socket.accept()
    try:
        print(f"连接来自 {client_address}")

        # 接收数据
        data = connection.recv(1024)
        print(f"收到 {len(data)} 字节的数据: {data.decode()}")

        # 发送数据
        connection.sendall(data)  # 回显收到的数据

    finally:
        # 清理连接
        connection.close()

客户端(TCP Client)

python 复制代码
import socket

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

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

try:
    # 发送数据
    message = b'这是一个测试消息'
    print(f"发送 {len(message)} 字节的数据: {message.decode()}")
    client_socket.sendall(message)

    # 接收响应
    data = client_socket.recv(1024)
    print(f"收到 {len(data)} 字节的数据: {data.decode()}")

finally:
    # 清理连接
    client_socket.close()
UDP 示例

服务器端(UDP Server)

python 复制代码
import socket

# 创建一个UDP/IP套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 绑定服务器地址和端口
server_address = ('localhost', 10000)
sock.bind(server_address)

print(f"等待消息在 {server_address}")

while True:
    # 接收数据
    data, address = sock.recvfrom(4096)
    print(f"收到 {len(data)} 字节的数据来自 {address}: {data.decode()}")

    if data:
        sent = sock.sendto(data, address)
        print(f"发送 {sent} 字节的数据回 {address}")

客户端(UDP Client)

python 复制代码
import socket

# 创建一个UDP/IP套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 服务器地址和端口
server_address = ('localhost', 10000)

try:
    # 发送数据
    message = b'这是一个UDP测试消息'
    print(f"发送 {len(message)} 字节的数据: {message.decode()}")
    sent = sock.sendto(message, server_address)

    # 接收响应
    data, server = sock.recvfrom(4096)
    print(f"收到 {len(data)} 字节的数据来自 {server}: {data.decode()}")

finally:
    # 清理连接
    print("关闭套接字")
    sock.close()

2. 使用高级库

除了直接使用socket模块,Python还提供了许多高级库来简化网络编程。

HTTP服务器(使用http.server模块)
python 复制代码
from http.server import SimpleHTTPRequestHandler, HTTPServer

# 定义请求处理器
class MyHandler(SimpleHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()
        self.wfile.write(b"Hello, world!")

# 创建服务器对象
server_address = ('localhost', 8000)
httpd = HTTPServer(server_address, MyHandler)

print(f"启动HTTP服务器在 {server_address}")
httpd.serve_forever()
使用requests库进行HTTP客户端通信
python 复制代码
import requests

# 发送GET请求
response = requests.get('http://www.example.com')
print(response.status_code)
print(response.text)

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

3. 异步网络编程

对于需要处理大量并发连接的应用,可以使用异步编程。Python的asyncio库提供了异步I/O的支持。

异步TCP服务器
python 复制代码
import asyncio

async def handle_echo(reader, writer):
    data = await reader.read(100)
    message = data.decode()
    addr = writer.get_extra_info('peername')
    print(f"收到 {len(message)} 来自 {addr} 的数据: {message}")

    print(f"发送: {message!r}")
    writer.write(data)
    await writer.drain()

    print("关闭连接")
    writer.close()

async def main():
    server = await asyncio.start_server(
        handle_echo, '127.0.0.1', 8888)

    addr = server.sockets[0].getsockname()
    print(f'服务在 {addr} 运行')

    async with server:
        await server.serve_forever()

asyncio.run(main())
异步HTTP客户端
python 复制代码
import aiohttp
import asyncio

async def fetch(session, url):
    async with session.get(url) as response:
        return await response.text()

async def main():
    async with aiohttp.ClientSession() as session:
        html = await fetch(session, 'http://www.example.com')
        print(html)

asyncio.run(main())

总结

Python网络编程提供了从底层套接字到高级HTTP服务器和客户端的各种工具。选择哪种方法取决于具体的应用需求和性能要求。理解这些基础知识将帮助你构建健壮和高效的网络应用程序。

相关推荐
(:满天星:)5 小时前
第31篇:块设备与字符设备管理深度解析(基于OpenEuler 24.03)
linux·运维·服务器·网络·centos
野蛮人6号7 小时前
虚拟机网络编译器还原默认设置后VMnet8和VMnet1消失了
网络·vmware·虚拟机网络编译器·vmnet8消失
scuter_yu7 小时前
主流零信任安全产品深度介绍
运维·网络·安全
江苏思维驱动智能研究院有限公司8 小时前
Sophos 网络安全:全球领先的自适应安全解决方案提供商
网络·安全·web安全
面朝大海,春不暖,花不开8 小时前
Java网络编程:TCP/UDP套接字通信详解
java·网络·tcp/ip
ChicagoTypewriter8 小时前
计算机网络中的常用表项梳理
网络·计算机网络·智能路由器
Bruce_Liuxiaowei11 小时前
常见高危端口风险分析与防护指南
网络·网络安全·端口·信息搜集
tmacfrank12 小时前
Android 网络全栈攻略(四)—— TCPIP 协议族与 HTTPS 协议
android·网络·https
liulilittle12 小时前
深度剖析:OPENPPP2 libtcpip 实现原理与架构设计
开发语言·网络·c++·tcp/ip·智能路由器·tcp·通信
cui_win12 小时前
【内存】Linux 内核优化实战 - net.ipv4.tcp_tw_reuse
linux·网络·tcp/ip