2025.6.2

WebSocket 测试页面

以下是一个简单的 HTML 测试页面,用于测试你的 WebSocket 接口。这个页面允许用户连接 WebSocket,发送消息并接收响应。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>WebSocket 面试测试页面</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            max-width: 800px;
            margin: 0 auto;
            padding: 20px;
        }
        #controls {
            margin-bottom: 20px;
        }
        #connectBtn {
            background-color: #4CAF50;
            color: white;
            padding: 10px 15px;
            border: none;
            border-radius: 4px;
            cursor: pointer;
        }
        #disconnectBtn {
            background-color: #f44336;
            color: white;
            padding: 10px 15px;
            border: none;
            border-radius: 4px;
            cursor: pointer;
        }
        #startInterviewBtn {
            background-color: #2196F3;
            color: white;
            padding: 10px 15px;
            border: none;
            border-radius: 4px;
            cursor: pointer;
            margin-top: 10px;
        }
        #endInterviewBtn {
            background-color: #ff9800;
            color: white;
            padding: 10px 15px;
            border: none;
            border-radius: 4px;
            cursor: pointer;
            margin-top: 10px;
        }
        #messageLog {
            height: 300px;
            border: 1px solid #ddd;
            padding: 10px;
            overflow-y: auto;
            margin-bottom: 10px;
            background-color: #f9f9f9;
        }
        #messageInput {
            width: 70%;
            padding: 10px;
            margin-right: 10px;
        }
        #sendBtn {
            padding: 10px 15px;
            background-color: #4CAF50;
            color: white;
            border: none;
            border-radius: 4px;
            cursor: pointer;
        }
        .message {
            margin-bottom: 10px;
            padding: 8px;
            border-radius: 4px;
        }
        .received {
            background-color: #e3f2fd;
            border-left: 4px solid #2196F3;
        }
        .sent {
            background-color: #e8f5e9;
            border-left: 4px solid #4CAF50;
        }
        .system {
            background-color: #fff3e0;
            border-left: 4px solid #ff9800;
        }
        .error {
            background-color: #ffebee;
            border-left: 4px solid #f44336;
        }
    </style>
</head>
<body>
    <h1>WebSocket 面试测试</h1>
    
    <div id="controls">
        <input type="text" id="clientId" placeholder="输入客户端ID" value="1">
        <button id="connectBtn">连接</button>
        <button id="disconnectBtn" disabled>断开连接</button>
        <button id="startInterviewBtn" disabled>开始面试</button>
        <button id="endInterviewBtn" disabled>结束面试</button>
    </div>
    
    <div id="messageLog"></div>
    
    <div>
        <input type="text" id="messageInput" placeholder="输入消息..." disabled>
        <button id="sendBtn" disabled>发送</button>
    </div>
    
    <script>
        let socket;
        const clientIdInput = document.getElementById('clientId');
        const connectBtn = document.getElementById('connectBtn');
        const disconnectBtn = document.getElementById('disconnectBtn');
        const startInterviewBtn = document.getElementById('startInterviewBtn');
        const endInterviewBtn = document.getElementById('endInterviewBtn');
        const messageInput = document.getElementById('messageInput');
        const sendBtn = document.getElementById('sendBtn');
        const messageLog = document.getElementById('messageLog');
        
        // 添加消息到日志
        function addMessage(content, type = 'received') {
            const messageElement = document.createElement('div');
            messageElement.className = `message ${type}`;
            messageElement.textContent = content;
            messageLog.appendChild(messageElement);
            messageLog.scrollTop = messageLog.scrollHeight;
        }
        
        // 连接 WebSocket
        connectBtn.addEventListener('click', () => {
            const clientId = clientIdInput.value.trim();
            if (!clientId) {
                alert('请输入客户端ID');
                return;
            }
            
            // 创建 WebSocket 连接
            socket = new WebSocket(`ws://localhost:8000/ws/${clientId}`);
            
            socket.onopen = (event) => {
                addMessage('WebSocket 连接已建立', 'system');
                connectBtn.disabled = true;
                disconnectBtn.disabled = false;
                startInterviewBtn.disabled = false;
                clientIdInput.disabled = true;
                
                // 发送客户端ID
                socket.send(clientId);
            };
            
            socket.onmessage = (event) => {
                try {
                    const data = JSON.parse(event.data);
                    if (data.type === 'question') {
                        addMessage(`AI 问题 (回合 ${data.turn_count}): ${data.content}`, 'received');
                        messageInput.disabled = false;
                        sendBtn.disabled = false;
                        endInterviewBtn.disabled = false;
                    } else if (data.type === 'end') {
                        addMessage(`系统: ${data.content}`, 'system');
                        messageInput.disabled = true;
                        sendBtn.disabled = true;
                        startInterviewBtn.disabled = false;
                        endInterviewBtn.disabled = true;
                    } else if (data.type === 'error') {
                        addMessage(`错误: ${data.content}`, 'error');
                    } else {
                        addMessage(`服务器: ${event.data}`, 'received');
                    }
                } catch (e) {
                    addMessage(`服务器: ${event.data}`, 'received');
                }
            };
            
            socket.onclose = (event) => {
                if (event.wasClean) {
                    addMessage(`连接已关闭,代码=${event.code} 原因=${event.reason}`, 'system');
                } else {
                    addMessage('连接中断', 'error');
                }
                connectBtn.disabled = false;
                disconnectBtn.disabled = true;
                startInterviewBtn.disabled = true;
                endInterviewBtn.disabled = true;
                messageInput.disabled = true;
                sendBtn.disabled = true;
                clientIdInput.disabled = false;
            };
            
            socket.onerror = (error) => {
                addMessage(`WebSocket 错误: ${error.message}`, 'error');
            };
        });
        
        // 断开 WebSocket 连接
        disconnectBtn.addEventListener('click', () => {
            if (socket) {
                socket.close();
            }
        });
        
        // 开始面试
        startInterviewBtn.addEventListener('click', () => {
            if (socket && socket.readyState === WebSocket.OPEN) {
                const message = {
                    type: "start_interview"
                };
                socket.send(JSON.stringify(message));
                addMessage('发送: ' + JSON.stringify(message), 'sent');
                startInterviewBtn.disabled = true;
            }
        });
        
        // 结束面试
        endInterviewBtn.addEventListener('click', () => {
            if (socket && socket.readyState === WebSocket.OPEN) {
                const message = {
                    type: "end_interview"
                };
                socket.send(JSON.stringify(message));
                addMessage('发送: ' + JSON.stringify(message), 'sent');
                messageInput.disabled = true;
                sendBtn.disabled = true;
                startInterviewBtn.disabled = false;
                endInterviewBtn.disabled = true;
            }
        });
        
        // 发送消息
        sendBtn.addEventListener('click', () => {
            const message = messageInput.value.trim();
            if (message && socket && socket.readyState === WebSocket.OPEN) {
                const data = {
                    type: "answer",
                    content: message
                };
                socket.send(JSON.stringify(data));
                addMessage(`发送答案: ${message}`, 'sent');
                messageInput.value = '';
                messageInput.disabled = true;
                sendBtn.disabled = true;
            }
        });
        
        // 允许按 Enter 键发送消息
        messageInput.addEventListener('keypress', (e) => {
            if (e.key === 'Enter') {
                sendBtn.click();
            }
        });
    </script>
</body>
</html>

使用说明

  1. 将上面的代码保存为 websocket_test.html 文件
  2. 在浏览器中打开该文件
  3. 输入客户端ID(默认为1)
  4. 点击"连接"按钮建立WebSocket连接
  5. 连接成功后,点击"开始面试"按钮开始面试
  6. 在输入框中回答AI的问题,然后按Enter或点击"发送"按钮
  7. 面试结束后,点击"结束面试"按钮
  8. 可以随时点击"断开连接"按钮关闭WebSocket连接

功能说明

  • 页面会显示所有发送和接收的消息
  • 不同类型的消息有不同的颜色标识:
    • 蓝色:接收到的消息(AI问题)
    • 绿色:发送的消息(用户回答)
    • 橙色:系统消息(连接状态等)
    • 红色:错误消息
  • 按钮状态会根据连接状态自动更新

这个测试页面模拟了完整的面试流程,包括连接、开始面试、回答问题、结束面试和断开连接等所有功能。

posted @ 2025-06-02 23:04  258333  阅读(37)  评论(0)    收藏  举报