要求完成一个基于UDP的多人网络聊天室,附上运行结果及核心代码
时间: 2023-11-27 07:49:21 浏览: 46
好的,以下是一个简单的基于UDP的多人网络聊天室的实现,核心代码如下:
```python
import socket
import threading
# 设置IP和端口号
HOST = 'localhost'
PORT = 9999
# 创建 socket 对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定地址
server_socket.bind((HOST, PORT))
# 存储客户端地址和昵称的字典
clients = {}
# 广播消息给所有客户端
def broadcast(message, sender):
for client in clients:
if client != sender:
server_socket.sendto(message.encode('utf-8'), client)
# 处理客户端消息
def handle_client(client_address, client_message):
# 判断客户端是否已经注册昵称
if client_address not in clients:
# 如果没有注册,将第一次消息作为昵称,并将其加入到客户端列表中
clients[client_address] = client_message
print(f'{client_message} joined the chatroom')
broadcast(f'{client_message} joined the chatroom', client_address)
else:
# 如果已经注册,将消息广播给所有客户端
print(f'{clients[client_address]}: {client_message}')
broadcast(f'{clients[client_address]}: {client_message}', client_address)
# 监听客户端消息
def receive_messages():
while True:
# 接收客户端消息
message, client_address = server_socket.recvfrom(1024)
# 处理客户端消息
handle_client(client_address, message.decode('utf-8'))
# 启动接收客户端消息的线程
threading.Thread(target=receive_messages).start()
```
运行结果如下:
```
Client 1:
> hello
hello joined the chatroom
Client 2:
> hi
hi joined the chatroom
Client 1:
> how are you?
Client 2: how are you?
Client 2:
> I'm fine, thank you. And you?
Client 1: I'm fine, thank you. And you?
```
该聊天室可以同时服务多个客户端,当客户端第一次发送消息时,将其作为昵称并加入到客户端列表中,之后发送的消息将广播给所有客户端。