用python写 实现多个聊天室
时间: 2023-07-20 12:40:30 浏览: 99
实现多个聊天室的基本思路如下:
1. 创建一个服务器程序,使用socket模块监听客户端的请求。
2. 当客户端连接到服务器时,服务器为其分配一个唯一的ID,并将其加入到一个默认的聊天室中。
3. 客户端可以选择加入其他聊天室,服务器需要维护一个聊天室列表,以及每个聊天室中用户的列表。
4. 当客户端发送消息时,服务器将该消息广播到该客户端所在的聊天室中的所有用户。
5. 客户端可以选择退出聊天室或者直接退出程序,服务器需要清除该用户的信息。
Python实现多个聊天室的代码如下:
```
import socket
import threading
class ChatServer:
def __init__(self, host, port):
self.host = host
self.port = port
self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.s.bind((self.host, self.port))
self.s.listen(5)
self.rooms = {'default': []}
self.users = {}
def broadcast(self, msg, room, sender):
for user in self.rooms[room]:
if user != sender:
try:
user.send(msg.encode())
except socket.error:
self.remove_user(user)
def remove_user(self, user):
for room in self.rooms.values():
if user in room:
room.remove(user)
del self.users[user]
def handle_client(self, user):
user.send("Enter your name: ".encode())
name = user.recv(1024).strip().decode()
self.users[user] = name
self.rooms['default'].append(user)
user.send("Welcome to the chat room!\n".encode())
while True:
try:
msg = user.recv(1024)
if not msg:
self.remove_user(user)
break
msg = "<{}> {}".format(name, msg.decode())
room = [k for k, v in self.rooms.items() if user in v][0]
self.broadcast(msg, room, user)
except socket.error:
self.remove_user(user)
break
def run(self):
print("Chat server started on {}:{}".format(self.host, self.port))
while True:
user, addr = self.s.accept()
print("{} connected.".format(addr))
threading.Thread(target=self.handle_client, args=(user,)).start()
if __name__ == '__main__':
server = ChatServer('localhost', 8888)
server.run()
```
这个代码实现了一个简单的聊天服务器,可以供多个客户端连接并参与聊天。默认的聊天室是“default”,新建聊天室时需要指定一个唯一的名称。每个客户端可以选择加入某个聊天室或者退出当前聊天室。
阅读全文