欢迎光临
我们一直在努力

Python 网络编程:Socket/TCP/UDP 协议实现

Python 网络编程:Socket/TCP/UDP 协议实现

网络编程是 Python 的重要应用领域,Socket 编程实现了网络通信的基础功能。本文将深入探讨 Python 网络编程的核心技术,包括 Socket 编程、TCP 协议、UDP 协议等。

Socket 基础

Socket 是网络通信的基本单元,提供了进程间通信的接口。

import socket

def socket_basic_demo():
    print("Socket 基础演示:")
    
    print("1. 创建 Socket")
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    print(f"Socket 家族: {sock.family}")
    print(f"Socket 类型: {sock.type}")
    
    sock.close()

socket_basic_demo()

TCP 服务器

TCP 服务器提供可靠的面向连接的服务。

def tcp_server_demo():
    print("TCP 服务器演示:")
    
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind(('localhost', 12345))
    server_socket.listen(5)
    
    print("服务器启动,等待连接...")
    
    while True:
        client_socket, address = server_socket.accept()
        print(f"客户端连接: {address}")
        
        data = client_socket.recv(1024)
        print(f"接收数据: {data.decode()}")
        
        client_socket.send(b"Hello Client!")
        client_socket.close()

tcp_server_demo()

TCP 客户端

TCP 客户端连接到服务器并发送数据。

def tcp_client_demo():
    print("TCP 客户端演示:")
    
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client_socket.connect(('localhost', 12345))
    
    client_socket.send(b"Hello Server!")
    
    data = client_socket.recv(1024)
    print(f"接收数据: {data.decode()}")
    
    client_socket.close()

tcp_client_demo()

UDP 服务器

UDP 服务器提供无连接的数据报服务。

def udp_server_demo():
    print("UDP 服务器演示:")
    
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    server_socket.bind(('localhost', 12345))
    
    print("服务器启动,等待数据...")
    
    while True:
        data, address = server_socket.recvfrom(1024)
        print(f"接收来自 {address} 的数据: {data.decode()}")
        
        server_socket.sendto(b"Hello Client!", address)

udp_server_demo()

UDP 客户端

UDP 客户端发送数据报到服务器。

def udp_client_demo():
    print("UDP 客户端演示:")
    
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    
    client_socket.sendto(b"Hello Server!", ('localhost', 12345))
    
    data, address = client_socket.recvfrom(1024)
    print(f"接收数据: {data.decode()}")
    
    client_socket.close()

udp_client_demo()

网络编程架构

graph TD
    A[应用层] --> B[传输层]
    B --> C[网络层]
    C --> D[数据链路层]
    D --> E[物理层]
    B --> F[TCP]
    B --> G[UDP]
    F --> H[可靠传输]
    G --> I[不可靠传输]

非阻塞 Socket

非阻塞 Socket 允许程序在等待 I/O 时执行其他任务。

def nonblocking_socket_demo():
    print("非阻塞 Socket 演示:")
    
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.setblocking(False)
    
    try:
        sock.connect(('localhost', 12345))
    except BlockingIOError:
        print("连接进行中...")
    
    sock.close()

nonblocking_socket_demo()

多路复用

多路复用同时监控多个 Socket。

import select

def multiplexing_demo():
    print("多路复用演示:")
    
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind(('localhost', 12345))
    server_socket.listen(5)
    server_socket.setblocking(False)
    
    inputs = [server_socket]
    
    while inputs:
        readable, _, _ = select.select(inputs, [], [])
        
        for sock in readable:
            if sock is server_socket:
                client_socket, address = sock.accept()
                print(f"客户端连接: {address}")
                inputs.append(client_socket)
            else:
                data = sock.recv(1024)
                if data:
                    print(f"接收数据: {data.decode()}")
                else:
                    inputs.remove(sock)
                    sock.close()

multiplexing_demo()

SSL/TLS 加密

SSL/TLS 加密保护网络通信安全。

import ssl

def ssl_demo():
    print("SSL/TLS 加密演示:")
    
    context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
    
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind(('localhost', 12345))
    server_socket.listen(5)
    
    ssl_socket = context.wrap_socket(server_socket, server_side=True)
    
    print("SSL 服务器启动")

ssl_demo()

HTTP 客户端

HTTP 客户端发送 HTTP 请求。

import urllib.request

def http_client_demo():
    print("HTTP 客户端演示:")
    
    url = 'https://httpbin.org/get'
    
    response = urllib.request.urlopen(url)
    data = response.read()
    
    print(f"状态码: {response.status}")
    print(f"响应长度: {len(data)}")

http_client_demo()

WebSocket 通信

WebSocket 提供全双工通信。

import asyncio
import websockets

async def websocket_server(websocket, path):
    async for message in websocket:
        print(f"接收消息: {message}")
        await websocket.send(f"Echo: {message}")

async def websocket_demo():
    print("WebSocket 通信演示:")
    
    server = await websockets.serve(websocket_server, 'localhost', 8765)
    await server.wait_closed()

asyncio.run(websocket_demo())

总结

Python 网络编程通过 Socket、TCP、UDP 等技术,实现了灵活的网络通信。掌握这些网络编程技术,对于构建网络应用至关重要。

在实际应用中,需要根据通信需求选择合适的协议和技术,平衡性能和可靠性。良好的网络编程实践能够显著提高应用的通信效率。

https://segmentfault.com/a/1190000047614875

未经允许不得转载:IT极限技术分享汇 » Python 网络编程:Socket/TCP/UDP 协议实现

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址