Python Socket网络编程详解

Python 网络编程(Socket)详解

Socket 的核心用途

Socket 是网络通信的底层基石,它允许不同设备(或同一设备)上的程序通过 TCP/IP 协议栈交换数据。在 Python 中,socket 模块提供了对 BSD Socket API 的封装,支持 TCP、UDP 等协议。

服务器端代码(接收端 - 电脑 A)

import socket

def tcp_server():
    # 创建 TCP socket
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    # 绑定到所有网络接口的 9999 端口
    server_socket.bind(('0.0.0.0', 9999))
    
    # 开始监听,设置最大连接数为 5
    server_socket.listen(5)
    print("TCP 服务器已启动,等待客户端连接...")
    
    try:
        # 接受客户端连接
        client_socket, client_addr = server_socket.accept()
        print(f"客户端 {client_addr} 已连接")
        
        # 接收数据
        data = client_socket.recv(1024)
        print(f"收到消息: {data.decode('utf-8')}")
        
        # 发送响应
        response = "服务器已收到您的消息"
        client_socket.send(response.encode('utf-8'))
        
    except Exception as e:
        print(f"发生错误: {e}")
    finally:
        # 关闭连接
        client_socket.close()
        server_socket.close()
        print("服务器已关闭")

if __name__ == "__main__":
    tcp_server()

客户端代码(发送端 - 电脑 B)

import socket

def tcp_client():
    # 创建 TCP socket
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    # 服务器地址(改为电脑 A 的实际 IP)
    server_ip = "192.168.1.100"  # 替换为服务器真实 IP
    server_port = 9999
    
    try:
        # 连接服务器
        client_socket.connect((server_ip, server_port))
        print(f"已连接到服务器 {server_ip}:{server_port}")
        
        # 发送数据
        message = "你好服务器!这是来自客户端的消息"
        client_socket.send(message.encode('utf-8'))
        print("消息已发送")
        
        # 接收响应
        response = client_socket.recv(1024)
        print(f"服务器响应: {response.decode('utf-8')}")
        
    except Exception as e:
        print(f"连接失败: {e}")
    finally:
        # 关闭连接
        client_socket.close()
        print("客户端已关闭")

if __name__ == "__main__":
    tcp_client()

在不同电脑上运行步骤

  1. 准备两台电脑

    • 电脑 A(服务器):IP 地址 192.168.1.100

    • 电脑 B(客户端):IP 地址 192.168.1.101

  2. 在电脑 A 上运行服务器

    python server.py
    # 输出: TCP 服务器已启动,等待客户端连接...

    python server.py # 输出: TCP 服务器已启动,等待客户端连接...
  3. 在电脑 B 上运行客户端

    python client.py
    # 输出: 已连接到服务器 192.168.1.100:9999
    #       消息已发送
    #       服务器响应: 服务器已收到您的消息
    #       客户端已关闭

    python client.py # 输出: 已连接到服务器 192.168.1.100:9999 # 消息已发送 # 服务器响应: 服务器已收到您的消息 # 客户端已关闭
  4. 查看电脑 A 的输出

    # 输出: 客户端 ('192.168.1.101', 54321) 已连接
    #       收到消息: 你好服务器!这是来自客户端的消息
    #       服务器已关闭

    # 输出: 客户端 ('192.168.1.101', 54321) 已连接 # 收到消息: 你好服务器!这是来自客户端的消息 # 服务器已关闭

关键配置说明

1. IP 地址设置

  • 局域网通信:使用内网 IP(如 192.168.x.x

  • 跨网络通信

    • 服务器端需要公网 IP

    • 在路由器设置端口转发(NAT)

    # 客户端连接公网服务器 server_ip = "203.0.113.5" # 服务器的公网 IP

2. 防火墙配置

  • 服务器端:开放 TCP 9999 端口入站

  • 客户端:允许 TCP 出站连接

Windows 防火墙设置:
  1. 控制面板 > Windows Defender 防火墙

  2. 高级设置 > 入站规则 > 新建规则

  3. 选择"端口" > TCP > 特定端口: 9999

  4. 允许连接 > 完成

Linux 防火墙设置:

sudo ufw allow 9999/tcp

3. 跨网络连接(端口转发)

如果服务器在 NAT 后面:

  1. 登录路由器管理界面

  2. 找到"端口转发"或"虚拟服务器"设置

  3. 添加规则:

    • 外部端口:9999

    • 内部 IP:192.168.1.100(服务器内网 IP)

    • 内部端口:9999

    • 协议:TCP

TCP 协议特点与最佳实践

TCP 与 UDP 对比

特性TCPUDP
连接方式面向连接(三次握手)无连接
可靠性高(确认重传机制)低(可能丢包)
数据顺序保证顺序不保证顺序
速度较慢较快
适用场景文件传输、网页、数据库实时视频、游戏、DNS

最佳实践建议

  1. 异常处理:添加完善的错误处理

    try: # 网络操作 except socket.error as e: print(f"网络错误: {e}") except ConnectionResetError: print("连接被对方重置")
  2. 数据边界处理:TCP 是流式协议,需处理消息边界

    # 添加消息长度前缀 message = "Hello Server!" header = len(message).to_bytes(4, 'big') # 4字节头部 client_socket.send(header + message.encode())
  3. 超时设置:避免无限期等待

    client_socket.settimeout(10.0) # 10秒超时
  4. 多客户端处理:使用线程或异步处理

    while True: client_sock, addr = server_socket.accept() # 创建新线程处理客户端 client_thread = threading.Thread(target=handle_client, args=(client_sock,)) client_thread.start()
  5. 资源管理:使用 with 语句自动关闭连接

    with socket.socket() as s: s.connect(('host', port)) s.send(b"data") # 退出时自动关闭

实际应用场景

  1. 文件传输:可靠传输大文件

  2. 远程管理:SSH/Telnet 客户端

  3. Web 服务:HTTP/HTTPS 通信

  4. 数据库连接:MySQL/PostgreSQL 客户端

  5. 消息队列:RabbitMQ/Kafka 生产者消费者

提示:对于高性能场景,可以考虑使用 Python 的 asyncio 库实现异步 TCP 服务器,能同时处理数千个连接。

通过 TCP 协议,您可以构建可靠的双向通信系统,适用于各种需要确保数据完整性的网络应用。

网络通信加密技术详解

在Python网络编程中,加密是确保数据安全的核心手段。以下是主流的加密方式及其在Socket通信中的应用:


一、加密方式分类与对比

加密类型代表算法密钥管理速度适用场景
对称加密AES, DES, 3DES共享密钥★★★★大数据量传输
非对称加密RSA, ECC公钥/私钥对★★密钥交换、数字签名
混合加密TLS/SSL结合二者优势★★★安全通信标准
散列算法SHA-256, MD5无密钥★★★★数据完整性验证
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值