html设计一个简易的网上聊天室,用户登陆后能发言,(用户名密码无需存入数据库)用户发言时,直接给出用户名,不需要用户手工输入用户名,显示所有在线成员,使用了WebSocket连接后台服务器,通过JSON格式传递消息。后台服
时间: 2024-01-07 10:06:17 浏览: 140
好的,以下是一个简单的 HTML 网页和后台服务器的代码,用于实现一个具有登陆、在线成员显示、聊天发送等功能的网上聊天室。
HTML 网页:
```html
<!DOCTYPE html>
<html>
<head>
<title>简易聊天室</title>
<script type="text/javascript">
// 创建 WebSocket 连接
var socket = new WebSocket("ws://localhost:8080");
// 当连接成功时,发送登陆消息和获取在线成员列表消息
socket.onopen = function(event) {
var username = prompt("请输入您的用户名:", "用户");
var loginMessage = {
"type": "login",
"username": username
};
socket.send(JSON.stringify(loginMessage));
var listMessage = {
"type": "list"
};
socket.send(JSON.stringify(listMessage));
};
// 当接收到消息时,将消息添加到聊天记录中
socket.onmessage = function(event) {
var message = JSON.parse(event.data);
if (message.type == "list") {
// 如果是在线成员列表消息,更新在线成员列表
var userList = document.getElementById("user-list");
userList.innerHTML = "";
for (var i = 0; i < message.data.length; i++) {
var user = document.createElement("li");
user.innerHTML = message.data[i];
userList.appendChild(user);
}
} else if (message.type == "chat") {
// 如果是聊天消息,添加到聊天记录中
var chatBox = document.getElementById("chat-box");
var newMessage = document.createElement("p");
newMessage.innerHTML = "<strong>" + message.username + ":</strong> " + message.message;
chatBox.appendChild(newMessage);
}
};
// 发送消息到服务器
function sendMessage() {
var message = document.getElementById("message").value;
var chatMessage = {
"type": "chat",
"message": message
};
socket.send(JSON.stringify(chatMessage));
document.getElementById("message").value = "";
}
</script>
</head>
<body>
<h1>欢迎来到简易聊天室</h1>
<div id="chat-box"></div>
<label for="message">消息:</label>
<input type="text" id="message" onkeydown="if(event.keyCode==13) sendMessage()"><br>
<button type="button" onclick="sendMessage()">发送</button>
<h2>在线成员</h2>
<ul id="user-list"></ul>
</body>
</html>
```
在这个网页中,我们使用了 WebSocket 连接来实现客户端和服务器的实时通信。当用户打开聊天室页面时,会自动建立 WebSocket 连接,并通过 `prompt()` 函数获取用户输入的用户名。然后,客户端通过 JSON 格式的消息向服务器发送登陆消息和获取在线成员列表消息。
当客户端接收到服务器发送的在线成员列表消息时,会更新在线成员列表的显示。当客户端接收到服务器发送的聊天消息时,会将消息添加到聊天记录中。
需要注意的是,我们在输入框中添加了 `onkeydown` 属性,当用户按下回车键时会触发发送消息的行为。
后台服务器:
```python
import asyncio
import json
import websockets
# 存储在线成员的列表
users = set()
async def list_users(websocket, path):
# 当客户端连接时,添加其到在线成员列表中
users.add(websocket)
try:
async for message in websocket:
# 当接收到客户端的消息时,解析消息内容
data = json.loads(message)
if data["type"] == "login":
# 如果是登陆消息,将用户名添加到在线成员列表中,并向所有客户端发送在线成员列表消息
username = data["username"]
users.remove(websocket)
users.add((websocket, username))
await broadcast_list()
elif data["type"] == "list":
# 如果是获取在线成员列表消息,向客户端发送在线成员列表消息
await send_list(websocket)
elif data["type"] == "chat":
# 如果是聊天消息,向所有客户端发送聊天消息
username = find_username(websocket)
chat_message = {
"type": "chat",
"username": username,
"message": data["message"]
}
await broadcast(chat_message)
finally:
# 当客户端断开连接时,从在线成员列表中删除其信息,并向所有客户端发送在线成员列表消息
users.remove(websocket)
await broadcast_list()
async def send_list(websocket):
# 向客户端发送在线成员列表消息
user_list = [find_username(ws) for ws in users if type(ws) == tuple]
list_message = {
"type": "list",
"data": user_list
}
await websocket.send(json.dumps(list_message))
async def broadcast(message):
# 向所有客户端发送消息
for user in users:
if type(user) == tuple:
await user[0].send(json.dumps(message))
async def broadcast_list():
# 向所有客户端发送在线成员列表消息
user_list = [find_username(ws) for ws in users if type(ws) == tuple]
list_message = {
"type": "list",
"data": user_list
}
await broadcast(list_message)
def find_username(websocket):
# 查找用户的用户名
for user in users:
if type(user) == tuple and user[0] == websocket:
return user[1]
return None
if __name__ == "__main__":
start_server = websockets.serve(list_users, "localhost", 8080)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()
```
在这个后台服务器中,我们使用了 Python 的 `websockets` 库来实现 WebSocket 通信。当客户端连接时,会将其添加到在线成员列表中。当客户端发送登陆消息、获取在线成员列表消息或聊天消息时,服务器会根据消息类型做出相应的处理,并向所有客户端发送消息。
需要注意的是,我们在在线成员列表中存储了一个元组,包括了客户端的 WebSocket 对象和用户名两个信息。这样可以在需要时方便地查找用户的用户名。
以上就是一个简单的网上聊天室的实现。由于这只是一个简单的示例程序,可能存在安全问题,请勿在生产环境中使用。
阅读全文