Python进阶教程:2_网络编程 零基础超详细教程
2026/8/13 22:46:17 网站建设 项目流程

网络编程就是让两台(或多台)电脑通过网络互相发送、接收数据。Python 内置了socket模块,可以非常方便地实现网络通信,是爬虫、后端服务、聊天程序、远程控制等功能的底层基础。

本文从最基础的网络概念讲起,全程用通俗类比 + 可运行代码示例,零基础也能一步步跑通、理解。


一、前置必懂:核心基础概念

先把几个最核心的概念搞明白,不然代码你只能抄,不知道为什么这么写。

1. 生活类比:网络通信 = 打电话

我们把两台电脑的通信类比成两个人打电话:

  • IP 地址:相当于对方的「电话号码」,用来定位到具体哪一台电脑
  • 端口号:相当于「分机号」,一台电脑上有很多程序,端口号用来区分数据发给哪个程序
  • Socket(套接字):相当于「电话机」,是通信的工具,所有数据收发都通过 socket 完成
  • 协议:相当于「通话规则」,比如要说普通话、先问好再说话,保证双方能听懂对方

2. IP 地址和端口号

  • IP 地址:定位电脑,格式比如192.168.1.100;本机测试用固定回环地址127.0.0.1,不需要联网也能测试
  • 端口号:定位程序,范围 0~65535
    • 0~1023:系统保留端口,比如网页服务默认 80 端口、SSH 默认 22 端口
    • 我们自己写程序,用 1024~65535 之间的端口即可
    • 同一台电脑上,一个端口只能被一个程序占用

3. 两大核心协议:TCP 和 UDP

这是网络编程最常用的两种通信方式,区别非常重要:

表格

对比项TCP 协议UDP 协议
连接方式面向连接:必须先建立连接才能通信(像打电话,先拨号接通再说话)无连接:不需要建立连接,直接发数据(像发短信,直接发过去)
可靠性可靠:保证数据不丢、不乱序、不重复不可靠:不保证数据一定送到,可能丢包
传输速度稍慢更快
适用场景文件传输、网页、聊天、登录支付等需要可靠数据的场景视频直播、语音通话、游戏同步等追求速度、允许少量丢包的场景

4. Socket 是什么?

Socket 是操作系统提供的「网络通信工具」,Python 的socket模块就是对操作系统底层 socket 的封装。 不管是 TCP 还是 UDP 通信,都是通过创建 socket 对象,调用它的方法来收发数据。


二、TCP 网络编程(重点,最常用)

TCP 是「面向连接」的可靠协议,通信分为服务端客户端

  • 服务端:被动等待连接,一直开着等客户端连上来
  • 客户端:主动发起连接,连不上就报错

1. TCP 通信的完整流程

服务端流程(接电话的人)
  1. 创建 socket 电话机
  2. 绑定 IP 地址和端口号(绑定电话号码 + 分机号)
  3. 开启监听,等待连接(待机,等别人打过来)
  4. 接收客户端连接,建立通信通道(接听电话)
  5. 收发数据(通话)
  6. 关闭连接(挂电话)
客户端流程(打电话的人)
  1. 创建 socket 电话机
  2. 连接服务端的 IP + 端口(拨号)
  3. 收发数据(通话)
  4. 关闭连接(挂电话)

2. 最简 TCP 服务端代码(逐行讲解)

新建一个文件tcp_server.py,复制下面的代码:

# 1. 导入内置socket模块,不用安装 import socket # 2. 创建TCP socket对象 # AF_INET 表示用IPv4地址,SOCK_STREAM 表示用TCP协议 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 3. 绑定IP和端口 # 参数是元组:(IP地址, 端口号) # 127.0.0.1 表示只能本机访问;0.0.0.0 表示允许所有电脑访问 server_socket.bind(("127.0.0.1", 8888)) # 4. 开启监听 # 参数5表示:最多同时等待5个连接请求(新手不用深究,写个数字就行) server_socket.listen(5) print("服务端已启动,在8888端口等待客户端连接...") # 5. 等待客户端连接(阻塞等待:没人连就一直停在这里等) # accept() 会返回两个值:新的socket对象、客户端的地址(IP,端口) client_socket, client_addr = server_socket.accept() print(f"有客户端连接上来了,地址:{client_addr}") # 6. 接收客户端发来的数据 # recv(1024) 表示一次最多接收1024字节数据;返回的是bytes字节类型 recv_data = client_socket.recv(1024) # 字节转字符串:decode() 解码,默认用utf-8 recv_text = recv_data.decode("utf-8") print(f"收到客户端消息:{recv_text}") # 7. 给客户端回消息 # 字符串转字节:encode() 编码 send_text = "你好,我是服务端,收到你的消息了!" client_socket.send(send_text.encode("utf-8")) # 8. 关闭连接 client_socket.close() # 关闭和这个客户端的连接 server_socket.close() # 关闭服务端socket print("服务端关闭")

💡 新手必懂:accept()recv()默认是「阻塞」的 —— 没有连接 / 没有数据时,程序会停在这里等,不会往下走。


3. 最简 TCP 客户端代码(逐行讲解)

新建另一个文件tcp_client.py,和服务端放在同一个文件夹:

import socket # 1. 创建TCP socket对象 client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 2. 连接服务端:参数是(服务端IP, 服务端端口) # 因为是本机测试,IP写127.0.0.1,端口和服务端一致8888 client_socket.connect(("127.0.0.1", 8888)) print("成功连接到服务端") # 3. 给服务端发消息 msg = "你好服务端,我是客户端!" client_socket.send(msg.encode("utf-8")) # 4. 接收服务端的回复 recv_data = client_socket.recv(1024) print(f"收到服务端回复:{recv_data.decode('utf-8')}") # 5. 关闭连接 client_socket.close() print("客户端关闭")

4. 运行测试(新手必看步骤)

  1. 先运行服务端:打开命令行,执行python tcp_server.py

    • 此时会看到:服务端已启动,在8888端口等待客户端连接...
    • 程序会停住,等待客户端连接,这是正常的阻塞状态
  2. 再运行客户端:再开一个新的命令行窗口,执行python tcp_client.py

    • 客户端窗口会显示连接成功、收到服务端回复
    • 服务端窗口会显示有客户端连接、收到客户端消息
  3. 运行完两个程序都会自动关闭。

⚠️ 新手高频坑:先运行客户端、后运行服务端,会直接报错ConnectionRefusedError,因为服务端没开,连接不上。必须先开服务端,再开客户端。


5. 进阶:持续聊天的 TCP 服务端

上面的例子只能发一次消息就关闭了,我们可以加循环,实现「你一句我一句」的持续通信。

升级版服务端tcp_server_loop.py
import socket server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind(("127.0.0.1", 8888)) server_socket.listen(5) print("服务端启动,等待连接...") client_socket, client_addr = server_socket.accept() print(f"客户端{client_addr}已连接") while True: # 接收消息 recv_data = client_socket.recv(1024) recv_text = recv_data.decode("utf-8") print(f"客户端说:{recv_text}") # 客户端发exit就退出循环 if recv_text == "exit": print("客户端退出,结束通信") break # 回复消息 reply = f"收到:{recv_text}" client_socket.send(reply.encode("utf-8")) client_socket.close() server_socket.close()
升级版客户端tcp_client_loop.py
import socket client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client_socket.connect(("127.0.0.1", 8888)) print("连接服务端成功,输入exit退出") while True: # 用户输入消息 msg = input("请输入要发送的内容:") client_socket.send(msg.encode("utf-8")) if msg == "exit": print("退出聊天") break # 接收回复 recv_data = client_socket.recv(1024) print(f"服务端回复:{recv_data.decode('utf-8')}") client_socket.close()

运行后可以在客户端反复输入内容,服务端自动回复,输入exit就结束。

💡 说明:这个版本一次只能服务一个客户端,想同时服务多个客户端需要配合多线程,新手先把单客户端的基础吃透。


三、UDP 网络编程

UDP 是「无连接」的协议,不需要提前建立连接,知道对方的 IP + 端口就能直接发数据,速度快但不保证可靠。

1. UDP 的特点

  • 没有服务端、客户端的严格区分,两边地位平等
  • 不需要listen()connect()accept(),创建完 socket 直接收发
  • 发送用sendto(),需要指定对方地址;接收用recvfrom(),会返回数据和对方地址

2. UDP 接收端(类似服务端)

新建udp_receiver.py

import socket # 创建UDP socket:SOCK_DGRAM 表示UDP协议 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 绑定端口:等待别人发数据到这个端口 udp_socket.bind(("127.0.0.1", 9999)) print("UDP接收端已启动,等待数据...") while True: # 接收数据:返回(数据字节, 发送方地址) recv_data, sender_addr = udp_socket.recvfrom(1024) recv_text = recv_data.decode("utf-8") print(f"收到来自{sender_addr}的消息:{recv_text}") # 收到exit就退出 if recv_text == "exit": print("结束接收") break # 回复对方 reply = f"已收到:{recv_text}" udp_socket.sendto(reply.encode("utf-8"), sender_addr) udp_socket.close()

3. UDP 发送端(类似客户端)

新建udp_sender.py

import socket # 创建UDP socket udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 目标地址:接收端的IP和端口 target_addr = ("127.0.0.1", 9999) while True: msg = input("请输入要发送的内容:") # 直接发送数据,指定目标地址,不需要提前连接 udp_socket.sendto(msg.encode("utf-8"), target_addr) if msg == "exit": print("退出发送") break # 接收回复 recv_data, _ = udp_socket.recvfrom(1024) print(f"对方回复:{recv_data.decode('utf-8')}") udp_socket.close()

运行测试

  1. 先运行接收端:python udp_receiver.py
  2. 再运行发送端:python udp_sender.py
  3. 发送端输入内容,接收端就能收到,输入exit退出。

对比 TCP:UDP 不需要建立连接,写法更简单,但是数据可能丢包,适合对可靠性要求不高、追求速度的场景。


四、新手高频易错点 & 避坑指南

1. 编码错误:字符串和字节搞混

网络传输的只能是字节(bytes),不能直接传字符串。

  • 发数据:字符串 → 字节,用.encode("utf-8")
  • 收数据:字节 → 字符串,用.decode("utf-8")

错误示范(直接发字符串):

# ❌ 报错:a bytes-like object is required, not 'str' client_socket.send("你好")

正确写法:

# ✅ 先编码成字节 client_socket.send("你好".encode("utf-8"))

2. 连接失败:ConnectionRefusedError

原因基本都是三个:

  • 服务端没启动,先开服务端再开客户端
  • 端口号写错了,客户端和服务端端口必须一致
  • IP 地址写错了,本机测试用127.0.0.1

3. 端口被占用:Address already in use

如果程序异常退出,端口可能还被占用着,再启动就会报错。

  • 解决 1:换一个端口号,比如从 8888 改成 8889
  • 解决 2:杀掉占用端口的进程(新手直接换端口更简单)

4. recv () 一直卡住收不到数据

recv()是阻塞的,对方没发数据就会一直等。如果觉得卡住了,先检查对方有没有成功发送数据、编码是否正确。

5. 防火墙拦截

如果两台不同的电脑通信失败,先检查防火墙是否拦截了对应的端口,本机测试不会有这个问题。


五、核心总结

  1. 网络编程本质:两台电脑通过 socket 收发字节数据,IP 定位电脑,端口定位程序
  2. TCP 编程步骤
    • 服务端:创建 socket → 绑定 bind → 监听 listen → 接收连接 accept → 收发 recv/send → 关闭
    • 客户端:创建 socket → 连接 connect → 收发 recv/send → 关闭
  3. UDP 编程步骤:创建 socket → 直接收发 sendto/recvfrom → 关闭
  4. 选型建议:需要可靠传输选 TCP,追求速度、允许丢包选 UDP
  5. 必记规则:网络传输用字节,字符串收发必须编解码

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询