

统一声明:
1.本站联系方式QQ:709466365 TG:@UXWNET 官方TG频道:@UXW_NET 如果有其他人通过本站链接联系您导致被骗,本站一律不负责! 2.需要付费搭建请联系站长QQ:709466365 TG:@UXWNET 3.免实名域名注册购买- 游侠云域名 4.免实名国外服务器购买- 游侠网云服务
你是不是也有过这种感觉?想学编程却总觉得“门槛太高”,看教程时满屏的专业术语看得头大,或者想动手做个小项目练手,却不知道从哪里开始?其实编程没那么难,尤其是用Python这种“新手友好型”语言。今天我就带你用Python写一个能多人聊天的简易聊天室,全程说人话,零基础也能跟着做——我去年带一个完全没接触过编程的朋友做这个项目,他花了3小时就跑通了,你肯定也可以。
第一步:安装Python,5分钟搞定
不管你用Windows还是Mac,安装Python都很简单。我见过很多人卡在这一步,其实跟着步骤走根本不会错。
如果你用Windows系统,直接打开Python官网(记得选“Download Python X.X.X”,X.X.X是最新版本),下载后双击安装包。这里划重点:一定要勾选安装界面最下面的“Add Python to PATH”,不然之后在命令行里输“python”会没反应——我朋友当时就没勾,后来在命令行里折腾了20分钟才发现问题。安装完成后,按Win+R输入“cmd”打开命令提示符,输入python version
,如果显示“Python 3.X.X”,就说明装好了。
Mac用户更简单,系统自带Python,但可能是旧版本, 用Homebrew安装最新版。打开终端,输入/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
安装Homebrew(如果已经装过就跳过),然后输入brew install python
,等待几分钟后输入python3 version
,显示版本号就OK。
第二步:选个趁手的编辑器,我推荐VS Code
写代码总得有个“写字的本子”,编辑器就是干这个的。别选太复杂的工具,我推荐用VS Code——界面干净,操作简单,而且免费。你去VS Code官网下载对应系统的版本,安装时一路点“下一步”就行。
安装完成后,打开VS Code,先装个Python插件:左边栏点“扩展”(像四个小方块的图标),搜索“Python”,选第一个带“Microsoft”图标的,点“安装”。装完后重启VS Code,新建一个文件夹(比如叫“ChatRoom”),再在文件夹里建两个文件:server.py
(服务器端代码)和client.py
(客户端代码)——这两个文件就是我们聊天室的“核心零件”,后面写代码全在这里面。
第三步:测试环境,确保“工具好用”
在开始写代码前,咱们先测试一下环境是否正常。打开server.py
,输入一行最简单的代码:
print("聊天室服务器准备就绪!")
然后按Ctrl+S
保存,右键点击编辑器空白处,选“在终端中运行Python文件”。如果终端里显示“聊天室服务器准备就绪!”,说明你的编辑器和Python已经“串通好”了——这一步很重要,能避免后面写了几百行代码才发现环境有问题,白白浪费时间。
核心开发:手把手实现聊天室功能
环境搭好了,接下来就是写代码实现功能。你可能会想:“聊天室听起来挺复杂,又是服务器又是客户端,还要多人同时聊天,我能搞定吗?”放心,咱们拆成小块一步步来,就像搭积木一样,每一步都很简单。
先搞懂“聊天室原理”:就像开个“线上会议室”
在写代码前,我先用人话给你讲清楚聊天室是怎么工作的。其实它就像你和朋友开“线上会议室”:
socket
模块实现,它就像“电话线路”,服务器和客户端通过“IP地址+端口号”(相当于电话号码)连接,比如你家地址是“XX小区3栋201”(IP),门牌号是“201”(端口),别人知道这个才能找到你。 服务器端开发:写个“会议室管理员”
先写服务器端代码(server.py
),它要干三件事:等别人连接、收消息、把消息转发给所有人。我会一行行解释代码,看不懂的地方随时回头看。
Python自带两个核心模块:socket
(负责网络连接)和threading
(负责多线程,让多个用户同时聊天)。在server.py
最上面写:
import socket
import threading
就像会议室需要定好“在哪儿开”(地址)和“一次能进多少人”(最大连接数),服务器也需要这些设置:
# 服务器IP(本地测试用'127.0.0.1',同一局域网可用本机IP,比如'192.168.1.100')
HOST = '127.0.0.1'
端口号(随便选个1024-65535之间的数,别用80、443这些常用端口)
PORT = 12345
最多允许5个人同时连接(新手先从小规模试起)
MAX_USERS = 5
存所有连接的客户端(后面转发消息要用)
clients = []
服务器收到一个人的消息后,要转发给其他所有人。这个功能用broadcast
函数实现:
def broadcast(message, client_socket):
# 遍历所有已连接的客户端
for client in clients:
# 跳过发送消息的人(自己发的消息不用再发给自己)
if client != client_socket:
try:
# 发送消息(记得转成字节格式,网络传输只能传字节)
client.send(message)
except:
# 如果发送失败(比如对方断开连接),就把这个客户端从列表里删掉
client.close()
clients.remove(client)
每个连接到服务器的用户,都需要一个“专属线程”来处理他的消息(不然服务器一次只能处理一个人)。写个handle_client
函数:
def handle_client(client_socket):
while True:
try:
# 收消息(最多收1024字节,足够存日常聊天内容)
message = client_socket.recv(1024)
if message:
# 收到消息后转发给所有人
broadcast(message, client_socket)
else:
# 如果没收到消息,说明对方断开连接,退出循环
break
except:
continue
# 断开连接后清理
client_socket.close()
clients.remove(client_socket)
最后写启动服务器的代码,让它监听连接、接收客户端:
def start_server():
# 创建socket对象(AF_INET=用IPv4,SOCK_STREAM=用TCP协议,聊天需要可靠传输)
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定IP和端口
server_socket.bind((HOST, PORT))
# 开始监听,最多同时处理MAX_USERS个连接请求
server_socket.listen(MAX_USERS)
print(f"服务器已启动,在 {HOST}:{PORT} 等待连接...")
while True:
# 接受客户端连接(client_socket=客户端的“电话”,addr=客户端的“地址”)
client_socket, addr = server_socket.accept()
print(f"新连接:{addr}")
# 把新客户端加入列表
clients.append(client_socket)
# 开一个新线程处理这个客户端(这样就能同时处理多个人)
client_thread = threading.Thread(target=handle_client, args=(client_socket,))
client_thread.start()
启动服务器
start_server()
客户端开发:写个“聊天窗口”
服务器写完了,再写客户端(client.py
),让用户能输入消息、看别人的消息。
先写连接服务器的代码,需要用户输入服务器的IP和端口(本地测试直接用127.0.0.1:12345
):
import socket
import threading
import sys
连接服务器
def connect_server():
# 输入服务器IP和端口(本地测试直接回车用默认值)
host = input("输入服务器IP(默认127.0.0.1):") or '127.0.0.1'
port = input("输入端口号(默认12345):") or 12345
port = int(port)
# 创建客户端socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
client_socket.connect((host, port))
print("连接服务器成功!输入消息按回车发送,输入'quit'退出")
return client_socket
except:
print("连接失败!检查IP和端口是否正确")
sys.exit()
客户端需要两个线程:一个收消息(显示别人说的话),一个发消息(自己输入内容)。
收消息线程:
def receive_messages(client_socket):
while True:
try:
# 收服务器转发的消息
message = client_socket.recv(1024)
if message:
# 转成字符串打印(别人发的消息)
print(message.decode('utf-8'))
else:
break
except:
print("与服务器断开连接")
client_socket.close()
sys.exit()
发消息线程(带退出功能):
def send_messages(client_socket):
while True:
message = input()
if message.lower() == 'quit':
client_socket.close()
sys.exit()
# 发消息(记得转成字节,加上自己的标识,比如“[我]:”)
client_socket.send(f"[我]:{message}".encode('utf-8'))
最后把这些功能串起来:
def start_client():
client_socket = connect_server()
# 开线程收消息
receive_thread = threading.Thread(target=receive_messages, args=(client_socket,))
receive_thread.start()
# 主线程发消息
send_messages(client_socket)
启动客户端
start_client()
测试聊天室:叫上朋友一起试
代码写完了,咱们测试一下。先运行server.py
(右键“在终端中运行”),终端会显示“服务器已启动,在 127.0.0.1:12345 等待连接…”。然后再开2-3个终端,每个都运行client.py
,连接成功后,在一个客户端输入消息,其他客户端就能看到——比如你在第一个客户端输入“大家好”,其他客户端会显示“[我]:大家好”(这里的“我”其实是发送者,实际可以优化成显示昵称,后面教你改)。
这里有个小经验:我第一次测试时,只开了两个客户端,能正常聊天,但开第三个时没反应,后来发现是MAX_USERS
设成了2,改到5就好了——你测试时如果遇到“连接不上”,先检查服务器有没有启动,再看看是不是超过最大连接数。
聊天室核心功能模块说明
为了让你更清楚每个部分的作用,我做了个表格,对应代码里的关键模块:
模块名称 | 作用 | 关键代码位置 | 新手常见问题 |
---|---|---|---|
服务器监听模块 | 等待客户端连接,记录谁进来了 | server.py 中的 start_server 函数 | 端口被占用(换个端口号,比如12346) |
消息广播模块 | 把一个人的消息转发给所有人 | server.py 中的 broadcast 函数 | 消息乱码(发送时用 encode(‘utf-8’),接收时用 decode(‘utf-8’)) |
多线程处理模块 | 同时处理多个用户的消息 | server.py 中的 handle_client 函数(threading.Thread) | 程序崩溃(没处理断开连接的客户端,记得用 try-except 捕获错误) |
客户端交互模块 | 输入和显示消息 | client.py 中的 send_messages 和 receive_messages 函数 | 输入消息后没反应(检查是否同时运行了收消息和发消息线程) |
优化小技巧:让你的聊天室更好用
基础版聊天室写完了,你可以试试这些小优化,让它更像“正经聊天室”:
f"[{nickname}]:{message}"
。 user_count
变量,有人连接就+1,断开就-1,广播消息时带上在线人数。 这些功能实现起来都不难,比如加昵称,只需在客户端连接后让用户输入昵称,然后把昵称和消息一起发送——你可以先从这个开始改,改完后成就感会爆棚!
如果你按这些步骤写代码时遇到问题,比如“服务器启动报错”“客户端连不上”,别慌,先检查代码有没有抄错(尤其注意括号、冒号这些符号),再看看终端里的错误提示——大部分问题都是小细节没注意,比如端口被占用、IP输错了。实在解决不了,把错误截图和代码片段发到评论区,我看到会帮你看看!
给聊天室加上昵称其实特别实用,不然大家都显示“[我]”,根本分不清谁是谁。我之前帮朋友改这个功能的时候,他还说“早知道这么简单,一开始就该加上”。你先打开client.py那个文件,找到connect_server那个函数——就是用户输入服务器IP和端口的地方,在那里加一行让用户输入昵称的代码。具体来说,在“print(“连接服务器成功!…”)”那行前面,加一句“nickname = input(‘请输入你的昵称(1-8个字符):’)”,这样用户一连接上服务器,就会先被要求输入昵称,记得限制一下长度,1-8个字符差不多,太长了显示起来会挤。
改完输入昵称的地方,接下来要让发送的消息带上这个昵称。原来client.py里发消息是“[我]:{message}”,现在把“我”换成我们刚获取的nickname变量就行。你找到send_messages函数,把里面那句“client_socket.send(f”[我]:{message}”.encode(‘utf-8’))”改成“client_socket.send(f”[{nickname}]:{message}”.encode(‘utf-8’))”。记得加完代码按Ctrl+S保存,不然白改了。我当时第一次改的时候就忘了保存,运行客户端发现还是显示“[我]”,还以为代码写错了,后来才发现是没保存,白折腾了5分钟。
服务器那边其实不用动,因为服务器的作用就是“中转站”,收到什么消息就原样转发给所有人。你想啊,客户端发过去的消息已经带上“[昵称]”了,服务器转发的时候自然就把昵称一起发出去了,其他客户端收到的就是带昵称的消息。比如你输入昵称“程序员小A”,发消息“今天天气不错”,别人看到的就是“[程序员小A]:今天天气不错”,这样聊天的时候就清楚是谁说的话了。要是你想做得更完善点,还可以在服务器端加个昵称重复检测,不过新手阶段先实现基础功能就行,以后再慢慢优化。
安装Python时忘记勾选“Add Python to PATH”怎么办?
如果安装时没勾选“Add Python to PATH”,Windows用户可以手动添加环境变量:右键“此电脑”→“属性”→“高级系统设置”→“环境变量”,在“系统变量”中找到“Path”,点击“编辑”→“新建”,添加Python的安装路径(通常是“C:Users你的用户名AppDataLocalProgramsPythonPython3X”和“C:Users你的用户名AppDataLocalProgramsPythonPython3XScripts”),然后重启命令提示符即可。Mac用户无需担心这个问题,通过Homebrew安装的Python会自动配置环境变量。
运行server.py时提示“端口被占用”怎么解决?
端口被占用通常是因为其他程序正在使用你代码中设置的PORT(比如默认的12345)。解决方法很简单:打开server.py文件,找到“PORT = 12345”这一行,把12345换成1024-65535之间的其他数字(比如12346、12347),保存后重新运行服务器即可。改完端口后,客户端连接时也要输入新的端口号,保持和服务器一致。
客户端连接服务器时显示“连接失败”,可能的原因有哪些?
常见原因有3种:①服务器未启动:先确认server.py是否已成功运行,终端显示“服务器已启动,在…等待连接”才算正常;②IP或端口输入错误:本地测试时IP默认用127.0.0.1,端口要和server.py中的PORT一致;③防火墙拦截:Windows防火墙可能会阻止Python程序联网,尝试暂时关闭防火墙(测试完成后记得重新开启),或在防火墙设置中允许Python通过“公用网络”和“专用网络”。
为什么启动多个客户端后,消息只能发给部分人?
这可能是服务器的“最大连接数”限制导致的。在server.py中,有一行“MAX_USERS = 5”,表示最多允许5个客户端同时连接。如果启动的客户端数量超过这个值,超出的客户端会连接失败,或消息无法被服务器转发。你可以把MAX_USERS改大一些(比如改为10),保存后重启服务器,就能支持更多人同时聊天了。
如何给聊天室添加用户昵称功能?
简单三步即可实现:①在客户端连接服务器时,让用户输入昵称:在client.py的connect_server函数中,添加“nickname = input(‘请输入你的昵称:’)”;②发送消息时带上昵称:修改send_messages函数中的消息格式,把“[我]:{message}”改为“[{nickname}]:{message}”;③服务器转发时保持昵称:无需修改服务器代码,因为服务器会直接转发客户端发送的完整消息(包含昵称)。这样所有客户端收到的消息就会显示发送者的昵称了。
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
8. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别!
站长QQ:709466365 站长邮箱:709466365@qq.com