13、Python基础之网络编程

前言

网络编程就是两台计算机通过网络进行数据通信,底层依托Socket(套接字)。TCP和UDP是传输层最核心的两种协议。

  • TCP:面向连接、可靠、有序,有握手和重传,适合文件传输、网页、聊天
  • UDP:无连接、不可靠、速度快,没有连接建立过程,适合直播、语音、广播

Python使用内置socket模块完成网络编程,不需要额外安装。

TCP

TCP是面向连接的协议,通信流程:服务端先监听端口 → 客户端发起连接 → 建立连接后双向收发数据 → 通信结束关闭连接。

TCP服务端

复制代码
import socket

# 创建socket,AF_INET ipv4,SOCK_STREAM代表TCP
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定地址和端口
s.bind(('127.0.0.1', 9999))
# 开始监听,参数是等待连接队列最大数量
s.listen(5)
print("TCP服务端启动,等待客户端连接...")

while True:
    # 阻塞等待客户端接入,返回新socket连接对象、客户端地址
    conn, addr = s.accept()
    print(f"收到客户端连接:{addr}")
    with conn:
        while True:
            # recv接收数据,缓冲区大小1024字节
            data = conn.recv(1024)
            if not data:
                break
            print(f"收到消息:{data.decode('utf-8')}")
            # 回发数据
            conn.sendall(b"server receive: " + data)

TCP客户端

复制代码
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务端
s.connect(('127.0.0.1', 9999))
# 发送数据
s.sendall(b"Hello TCP")
# 接收返回
data = s.recv(1024)
print(data.decode("utf-8"))
s.close()

重点:TCP是流协议,数据没有边界,会出现粘包问题;recv不一定一次收到对方一次sendall发送的全部内容。

UDP

UDP是无连接协议,不用建立连接,直接发包,每个数据包独立。不需要listen()、accept()。 适合对实时性要求高、可以丢包的场景,比如视频直播、游戏。

UDP服务端

复制代码
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('127.0.0.1', 8888))
print("UDP服务端启动...")

while True:
    # recvfrom同时拿到数据和发送方地址
    data, addr = s.recvfrom(1024)
    print(f"来自{addr}:{data.decode('utf-8')}")
    s.sendto(b"udp received", addr)

UDP客户端

复制代码
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 直接发送,不需要connect
s.sendto(b"Hello UDP", ('127.0.0.1', 8888))
data, addr = s.recvfrom(1024)
print(data.decode("utf-8"))
s.close()

TCP与UDP对比

对比项 TCP UDP
连接 面向连接,三次握手建立连接 无连接,直接发数据包
可靠性 可靠传输,丢包自动重传,有序 不可靠,不重传,可能丢包、乱序
速度 较慢,开销大 快,开销极小
边界 字节流,无消息边界,存在粘包 数据报,每个包是独立消息
典型场景 HTTP、文件上传、数据库、SSH 语音通话、直播、游戏、DNS

补充知识点

  1. 127.0.0.1 是本机回环地址,只能本机访问;如果要局域网其他机器访问,绑定0.0.0.0;
  2. 端口范围:0~65535,小于1024是系统保留端口;
  3. socket收发都是bytes字节,字符串必须encode(),收到数据要decode();
  4. TCP服务端上面示例是单连接串行处理;并发需要多进程/多线程。

小结

  1. TCP:SOCK_STREAM,有连接、可靠,流程 bind -> listen -> accept -> recv/send;
  2. UDP:SOCK_DGRAM,无连接,使用 recvfrom / sendto;
  3. TCP保证数据送达,UDP追求速度;根据业务场景选择协议。
相关推荐
火云代理1 小时前
同一个网站,有的网络能打开、有的打不开?认识 IPv4 与 IPv6 的访问差异
服务器·网络·网络协议·tcp/ip·测试工具·php·状态模式
坤坤子吖1 小时前
Linux网络编程:TCP 粘包与半包问题,如何正确处理 TCP 流式数据?
linux·服务器·网络·笔记·网络协议·学习
火云代理4 小时前
Python 使用代理 IP 前,先弄清 Requests 的配置来源与验证方法
网络·python·网络协议·tcp/ip·ip
如夏倾城5 小时前
QUIC——HTTP/3 的唯一底层传输协议 及 0-RTT恢复
网络·网络协议·tcp/ip·安全·http
科研邪修法6 小时前
培训PDF保护配置:把需求转换成可验收权限
linux·服务器·网络
普通人68 小时前
WebGL与WebGPU入门指南
开发语言·webgl·1024程序员节
猫猫不是喵喵.1 天前
从0到1创建一个微服务项目
java·数据库·微服务·1024程序员节
略懂而已1 天前
安装SSL后网站速度变慢?
网络·网络协议·ssl
云上工程笔记1 天前
RDMA / IB 高速互联 GPU 云对比:多机训练网络性能与价格
网络·gpu算力·gpu