用python写一个聊天室 能实现一对多 入场填写用户名 入场通知 私聊 查询聊天室有哪些人 需要服务端代码和客户端代码
时间: 2024-03-03 12:49:31 浏览: 91
好的,以下是一个简单的Python聊天室的服务端和客户端代码。这个聊天室可以实现一对多的聊天,用户需要在入场时填写用户名,入场后会通知所有在线用户,并且支持私聊和查询聊天室在线用户。
服务端代码:
```python
import socket
import threading
# 创建socket对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 获取本地IP地址
HOST = socket.gethostbyname(socket.gethostname())
PORT = 8888
# 绑定IP地址和端口号
server_socket.bind((HOST, PORT))
# 设置最大连接数
server_socket.listen(10)
# 保存所有在线用户的连接对象和用户名
clients = {}
# 处理客户端连接请求的线程函数
def handle_client(client_socket, client_address):
# 获取客户端输入的用户名
username = client_socket.recv(1024).decode('utf-8')
# 保存用户的连接对象和用户名
clients[client_address] = username
# 通知所有在线用户有新用户加入
for address in clients.keys():
if address != client_address:
message = f'{username}加入了聊天室'
address[0].send(message.encode('utf-8'))
while True:
try:
# 接收客户端发送的消息
message = client_socket.recv(1024).decode('utf-8')
# 判断是否为私聊消息
if message.startswith('@'):
# 获取私聊对象的用户名和消息内容
to_username, message = message.split(' ', 1)
for address, username in clients.items():
if username == to_username:
address[0].send(f'{username}悄悄地对你说:{message}'.encode('utf-8'))
break
else:
# 将消息发送给所有在线用户
for address in clients.keys():
if address != client_address:
address[0].send(f'{username}: {message}'.encode('utf-8'))
except:
# 如果客户端断开连接,则从在线用户列表中删除该用户并通知其他用户
clients.pop(client_address)
message = f'{username}离开了聊天室'
for address in clients.keys():
address[0].send(message.encode('utf-8'))
break
# 循环接受客户端连接请求
while True:
client_socket, client_address = server_socket.accept()
# 创建一个新的线程处理客户端连接请求
client_thread = threading.Thread(target=handle_client, args=(client_socket, client_address))
client_thread.start()
```
客户端代码:
```python
import socket
import threading
# 创建socket对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 获取服务器IP地址和端口号
HOST = '127.0.0.1'
PORT = 8888
# 连接服务器
client_socket.connect((HOST, PORT))
# 获取用户输入的用户名
username = input('请输入您的用户名:')
# 发送用户名给服务器
client_socket.send(username.encode('utf-8'))
# 接收服务器发送的消息的线程函数
def receive_message():
while True:
message = client_socket.recv(1024).decode('utf-8')
print(message)
# 创建一个新的线程接收服务器发送的消息
receive_thread = threading.Thread(target=receive_message)
receive_thread.start()
# 循环读取用户输入的消息并发送给服务器
while True:
message = input('')
if message == 'quit':
break
client_socket.send(message.encode('utf-8'))
# 关闭socket连接
client_socket.close()
```
这个聊天室可以实现一对多的聊天,用户需要在入场时填写用户名,入场后会通知所有在线用户,并且支持私聊和查询聊天室在线用户。用户可以在客户端输入quit退出聊天室。
阅读全文