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 小时前
【Linux】线程互斥:多线程改同一个变量,到底会出什么问题
linux·服务器·1024程序员节
~城南花已开~1 小时前
25G网卡 Bond2 (Balance-XOR) 极限测试:28Gbps 并发与故障无缝切换实战
1024程序员节
Purple Coder1 小时前
超导性能对比
1024程序员节
小此方1 小时前
Re:Mysql数据库基础篇(四):一文吃透MySQL数据类型:精度陷阱、长度限制与存储机制
1024程序员节
lazy H1 小时前
【计算机网络】第 5 篇:TCP 和 UDP 有什么区别?从 Java 后端场景理解两种传输协议
经验分享·后端·网络协议·tcp/ip·计算机网络·1024程序员节
*小海豚*1 小时前
C盘占用大,windows系统清理C盘各软件 MSI 安装/修复缓存
1024程序员节
域智盾-终端安全管理1 小时前
终端安全管理系统:从“边界信任”到“终端零信任”的工程化落地
1024程序员节·终端安全管理系统
xiaogai_gai1 小时前
旺店通采购订单查询接口字段手册:queryWithDetail 实战权威教程
1024程序员节
黑旋风小威1 小时前
新手做网文漫改怎么提速 知漫剧自动拆分剧情分镜
人工智能·1024程序员节