接好运鸭 发表于 2026-7-15 20:21:31

从零学 Python,30 分钟写出第一个点对点聊天程序

本帖最后由 接好运鸭 于 2026-7-15 20:25 编辑

       很多 Python 初学者学完基础语法后很迷茫:变量、循环、条件判断全都看懂,但不知道能做出什么可以交互、看得见效果的项目。
本文带你从零起步,不依赖第三方框架,仅使用 Python 内置socket与threading标准库,30 分钟实现双向实时点对点聊天程序。理解代码的同时弄懂网络通信底层原理,搞懂微信、QQ 这类 IM 软件最基础的通信雏形。
前置要求:仅需安装 Python3.6 及以上版本,无需任何编程进阶知识;适合零基础入门、想要入门网络编程的新手。

一、先搞懂核心概念:Socket 是什么?

Socket(套接字)可以理解为两台电脑之间通信的接口、网络插座。
我们日常上网、聊天、传输文件,底层全部依靠 Socket 完成数据收发。
本次项目使用TCP 协议通信:

[*]TCP 面向连接,类似打电话,通信前必须建立连接;
[*]数据有序、不重复、可靠送达,适合聊天消息传输;
[*]分为两种角色:服务端(被动等待连接)、客户端(主动发起连接)。

关键痛点:普通单线程程序无法同时收发消息

常规顺序代码逻辑:等待接收消息→再发送消息。这样会造成阻塞,一方输入消息时无法收到对方内容。
解决方案:多线程 threading,单独开辟一条线程持续监听接收消息,主线程负责手动输入发送内容,实现双向互不干扰聊天。
简易架构说明:
本次演示分为server.py(服务端)、client.py(客户端);
局域网内两台电脑填写对应 IP 即可互通,同一台电脑测试直接使用127.0.0.1本地回环地址。

二、项目完整代码实现

1)服务端 server.py
import socket
import threading

# 配置IP与端口
HOST = "127.0.0.1"
PORT = 8899

# 创建TCP Socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 允许端口快速复用,避免重启提示端口占用
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind((HOST, PORT))
server_socket.listen(1)
print(f"【服务端启动成功】监听 {HOST}:{PORT},等待客户端接入...")

# 保存客户端连接对象
conn = None

# 持续接收消息函数
def recv_msg():
    global conn
    while True:
      try:
            data = conn.recv(1024)
            if not data:
                print("客户端已断开连接")
                break
            msg = data.decode("utf-8")
            print(f"\n【对方】{msg}")
      except Exception:
            print("连接异常,聊天终止")
            break

# 等待客户端连接
conn, addr = server_socket.accept()
print(f"成功建立连接:{addr}:{addr}")

# 启动接收消息子线程
thread = threading.Thread(target=recv_msg, daemon=True)
thread.start()

# 主线程:持续输入发送消息
while True:
    send_text = input("【我】")
    conn.send(send_text.encode("utf-8"))
    if send_text == "exit":
      conn.close()
      server_socket.close()
      break
2)客户端 client.py

import socket
import threading

# 修改为服务端IP,本地测试保持127.0.0.1
SERVER_HOST = "127.0.0.1"
SERVER_PORT = 8899

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((SERVER_HOST, SERVER_PORT))
print("✅ 成功连接服务端,可以开始聊天!")

# 持续接收消息
def recv_msg():
    while True:
      try:
            data = client_socket.recv(1024)
            if not data:
                print("服务端断开连接")
                break
            msg = data.decode("utf-8")
            print(f"\n【对方】{msg}")
      except Exception:
            print("连接中断")
            break

# 开启接收线程
thread = threading.Thread(target=recv_msg, daemon=True)
thread.start()

# 主线程发送消息
while True:
    send_text = input("【我】")
    client_socket.send(send_text.encode("utf-8"))
    if send_text == "exit":
      client_socket.close()
      break
三、分步运行测试(新手严格按顺序操作)



[*]首先运行服务端 server.py
终端执行:

bash


运行

python server.py


控制台输出:【服务端启动成功】监听 127.0.0.1:8899,等待客户端接入...


[*]新开一个终端窗口,运行客户端 client.py

bash

运行

python client.py

客户端提示✅连接成功,两端即可互相发送文字消息;
输入 exit 即可正常断开聊天。

局域网两台电脑互通额外设置:
① 查询服务端电脑内网 IP(Windows:ipconfig;Mac/Linux:ifconfig)
② 修改 client.py 中SERVER_HOST为服务端内网 IP
③ 防火墙放行 8899 端口,否则无法建立连接


四、逐段拆解核心代码,看懂每一行作用


1. socket 基础参数


[*]socket.AF_INET:使用 IPv4 地址
[*]socket.SOCK_STREAM:TCP 数据流模式
[*]bind((ip,端口)):服务端绑定地址端口
[*]listen():开启监听,等待客户端发起连接
[*]connect():客户端主动连接服务端地址

2. 编码与传输重点

Socket只能传输字节 bytes,不能直接发送字符串:
发送:字符串 → .encode("utf-8") 转为字节
接收:字节 → .decode("utf-8") 还原中文文本
如果忽略编码,中文消息会直接出现乱码。

3. 多线程为什么必不可少?

默认情况下recv()是阻塞函数:没有收到消息时代码卡在这一行,无法执行输入发送逻辑。
单独新建线程专门循环执行接收任务,主线程专门处理输入发送,实现双向并行通信。

五、当前程序局限与优化拓展方向

这个 demo 是极简教学版本,适合理解基础通信逻辑,距离成熟聊天软件还有大量功能可以迭代,适合课后自主练习:


[*]当前短板


[*]仅支持一对一单聊,无法多人同时在线;
[*]无消息加密,明文传输;
[*]异常处理简单,网络波动容易直接断开;
[*]没有图形界面,仅支持终端文字;
[*]无法公网直接通信(缺少端口映射、NAT 穿透)。


[*]进阶优化练习清单(循序渐进)


[*]增加用户昵称展示;
[*]增加消息发送时间戳;
[*]实现多客户端同时在线群聊;
[*]使用 tkinter/PyQt 增加可视化聊天窗口;
[*]增加文件互传功能;
[*]增加异常重连机制;
[*]使用 cryptography 实现消息加密传输。

六、常见踩坑问题汇总


问题 1:提示端口被占用

解决方案:修改代码内 PORT 端口数字,或者重启程序、开启端口复用代码(示例已内置)

问题 2:局域网客户端连不上服务端

排查顺序:关闭防火墙 → 确认 IP 地址正确 → 确认端口一致 → 两台设备处于同一个 WiFi 局域网

问题 3:中文消息乱码

必须统一收发两端utf-8编码,不要使用 gbk

问题 4:一方掉线程序直接崩溃

完善 try-except 异常捕获,可以优化自动重连逻辑


七、学习总结


完成这个点对点聊天程序,你一次性掌握三大知识点:


[*]Socket TCP 通信完整流程,明白互联网数据如何两台设备之间传递;
[*]Python 多线程并发原理,解决代码阻塞问题;
[*]字节与字符串编码转换、网络程序基础异常处理思路。

市面上所有即时通讯软件底层,本质都是持续收发数据包的 Socket 通信。看懂这套简易双向聊天 Demo,相当于打通网络编程入门最重要的一环。
后续想要学习爬虫、接口开发、游戏联机、物联网通信,Socket 都是无法绕开的底层基础。

如果你需要,我可以额外单独输出:


[*]适配 Windows、Mac 一键运行的完整项目压缩包说明;
[*]升级带 GUI 窗口图形化聊天版本完整代码;
[*]多人聊天室升级版代码。

页: [1]
查看完整版本: 从零学 Python,30 分钟写出第一个点对点聊天程序