用python写一个聊天室 能实现一对多 入场填写用户名 入场通知 私聊 查询聊天室有哪些人 需要服务端代码和客户端代码
时间: 2024-03-03 16:49:24 浏览: 21
好的,我可以帮你解决这个问题。首先,需要明确的是,聊天室需要客户端和服务端来实现,客户端负责用户输入和展示聊天信息,服务端负责处理用户的请求和转发聊天信息。下面是一个简单的实现:
服务端代码:
```python
import socket
import threading
# 保存用户名和对应的socket连接
clients = {}
# 处理客户端连接请求
def handle_client(conn, addr):
print(f"{addr} connected.")
conn.send("Welcome to chat room! Please enter your name:".encode())
name = conn.recv(1024).decode()
clients[name] = conn
broadcast(f"{name} entered the chat room.")
while True:
try:
msg = conn.recv(1024).decode()
if msg == "list":
conn.send("Current users: " + ", ".join(clients.keys()).encode())
elif msg.startswith("private"):
name, msg = msg.split(" ", 1)
if name in clients:
clients[name].send(f"From {addr}: {msg}".encode())
else:
conn.send("User not found.".encode())
else:
broadcast(f"{name}: {msg}")
except:
del clients[name]
broadcast(f"{name} left the chat room.")
print(f"{addr} disconnected.")
break
# 广播消息给所有客户端
def broadcast(msg):
for client in clients.values():
client.send(msg.encode())
if __name__ == "__main__":
HOST = "localhost"
PORT = 8000
# 创建socket并绑定到指定地址
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((HOST, PORT))
server.listen(5)
print("Server started.")
# 接受客户端连接请求
while True:
conn, addr = server.accept()
threading.Thread(target=handle_client, args=(conn, addr)).start()
```
客户端代码:
```python
import socket
import threading
# 从服务器接收消息并展示
def receive_msg(sock):
while True:
msg = sock.recv(1024).decode()
print(msg)
# 主函数
if __name__ == "__main__":
HOST = "localhost"
PORT = 8000
# 连接服务器
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT))
# 输入用户名
name = input("Please enter your name:")
sock.send(name.encode())
# 启动接收消息的线程
threading.Thread(target=receive_msg, args=(sock,)).start()
# 发送消息
while True:
msg = input()
if msg == "list":
sock.send(msg.encode())
elif msg.startswith("private"):
sock.send(msg.encode())
else:
sock.send(f"{name}: {msg}".encode())
```
注意事项:
- 代码中使用了多线程来处理多个客户端连接请求和消息的接收和转发,可以提高并发处理的能力。
- 在客户端输入消息时,如果输入"list",则会查询聊天室当前有哪些用户在线;如果输入"private [用户名] [消息]",则会给该用户发送私聊消息。