实现了聊天功能

This commit is contained in:
2025-09-18 16:55:35 +08:00
parent 56e4bd1c88
commit ad9142dced
3 changed files with 248 additions and 92 deletions

View File

@@ -1,59 +1,79 @@
import json
import socket
import threading
import json
def listen_for_messages(sock):
"""后台线程:监听并显示消息"""
while True:
try:
data = sock.recv(1024).decode("utf-8")
if not data:
break
resp = json.loads(data)
if resp["status"] == "msg":
print(f"\n📩 {resp['from']} 发来消息: {resp['msg']}")
print("请输入消息(q退出): ", end="", flush=True)
elif resp["status"] == "system":
print(f"\n👥 在线用户更新: {resp['users']}")
print("请输入消息(q退出): ", end="", flush=True)
except:
break
def chat(username, chat_obj, content):
'''
发送聊天信息
'''
pass
# 创建socket
ip_port = ("127.0.0.1", 9000)
sk = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 选择菜单
while 1:
print("menu".center(30, "="))
print("1.login".center(30, " "))
print("2.register".center(30, " "))
print("=".center(30, "="))
choice = input(">>>")
if choice == "1":
username = input("用户名:")
password = input("密码:")
data = {
"option": "login",
"username": username,
"password": password
}
sk.sendto(json.dumps(data).encode("utf-8"), ip_port)
msg, addr = sk.recvfrom(1024)
# {"status": 1}
if json.loads(msg.decode("utf-8"))["status"]:
chat_obj = input("输入收件人:")
content = input("输入内容:")
chat(username, chat_obj, content)
continue
def login_or_register(sock):
while True:
print("1. 登录")
print("2. 注册")
choice = input("请选择: ")
username = input("用户名: ")
password = input("密码: ")
if choice == "1":
sock.send(json.dumps({"action": "login", "username": username, "password": password}).encode("utf-8"))
else:
print("登录失败")
sock.send(json.dumps({"action": "register", "username": username, "password": password}).encode("utf-8"))
resp = json.loads(sock.recv(1024).decode("utf-8"))
print(resp["msg"])
if resp["status"] == "ok" and choice == "1":
return username
def chat(sock, username):
while True:
# 请求在线用户
sock.send(json.dumps({"action": "list_users"}).encode("utf-8"))
resp = json.loads(sock.recv(1024).decode("utf-8"))
users = resp.get("users", [])
if not users:
print("⚠️ 暂无其他在线用户")
continue
elif choice == "2":
username = input("用户名:")
password = input("密码:")
data = {
"option": "register",
"username": username,
"password": password
}
sk.sendto(json.dumps(data).encode("utf-8"), ip_port)
msg, addr = sk.recvfrom(1024)
# {"status": 1}
if json.loads(msg.decode("utf-8"))["status"]:
print("注册成功")
continue
else:
print(json.loads(msg.decode("utf-8"))["msg"])
print("\n=== 在线用户 ===")
for i, u in enumerate(users):
print(f"{i+1}. {u}")
choice = input("选择聊天对象编号(q退出): ")
if choice.lower() == "q":
break
try:
target = users[int(choice)-1]
except:
print("无效选择")
continue
# 聊天循环
while True:
msg = input("请输入消息(q退出): ")
if msg.lower() == "q":
break
sock.send(json.dumps({"action": "send", "to": target, "msg": msg}).encode("utf-8"))
def main():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("127.0.0.1", 8888))
username = login_or_register(sock)
# 开启监听线程
threading.Thread(target=listen_for_messages, args=(sock,), daemon=True).start()
# 主线程执行聊天逻辑
chat(sock, username)
if __name__ == "__main__":
main()