html模拟websocket通信

<!DOCTYPE html>

<html lang="zh-CN">

<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;

}

.container {

border: 1px solid #ccc;

border-radius: 5px;

padding: 20px;

margin-bottom: 20px;

}

h1, h2 {

color: #333;

}

input, button {

padding: 8px;

margin: 5px;

border-radius: 3px;

border: 1px solid #ccc;

}

button {

background-color: #007bff;

color: white;

cursor: pointer;

}

button:hover {

background-color: #0056b3;

}

#messages {

height: 300px;

overflow-y: auto;

border: 1px solid #eee;

padding: 10px;

background-color: #f9f9f9;

margin-top: 10px;

}

.message {

margin: 5px 0;

padding: 5px;

border-radius: 3px;

}

.sent {

background-color: #d1ecf1;

text-align: right;

}

.received {

background-color: #f8d7da;

}

.status {

font-weight: bold;

margin: 10px 0;

}

.connected {

color: green;

}

.disconnected {

color: red;

}

</style>

</head>

<body>

<h1>模拟WebSocket通信</h1>

<div class="container">

<h2>连接控制</h2>

<button id="connectBtn">连接</button>

<button id="disconnectBtn">断开</button>

<div id="status" class="status disconnected">未连接</div>

</div>

<div class="container">

<h2>消息发送</h2>

<input type="text" id="messageInput" placeholder="输入消息..." />

<button id="sendBtn">发送</button>

</div>

<div class="container">

<h2>消息记录</h2>

<div id="messages"></div>

</div>

<script>

// 模拟WebSocket对象

class MockWebSocket {

constructor(url) {

this.url = url;

this.readyState = 0; // CONNECTING

this.onopen = null;

this.onmessage = null;

this.onclose = null;

this.onerror = null;

// 模拟连接过程

setTimeout(() => {

this.readyState = 1; // OPEN

if (this.onopen) {

this.onopen(new Event('open'));

}

}, 1000);

}

send(data) {

if (this.readyState !== 1) {

if (this.onerror) {

this.onerror(new Error('WebSocket未连接'));

}

return;

}

// 模拟服务器响应(回显消息)

setTimeout(() => {

if (this.onmessage) {

// 创建模拟的消息事件

const messageEvent = {

data: `服务器回复: ${data}`,

type: 'message'

};

this.onmessage(messageEvent);

}

}, 500);

}

close() {

this.readyState = 3; // CLOSED

if (this.onclose) {

this.onclose(new CloseEvent('close'));

}

}

}

// DOM元素

const connectBtn = document.getElementById('connectBtn');

const disconnectBtn = document.getElementById('disconnectBtn');

const sendBtn = document.getElementById('sendBtn');

const messageInput = document.getElementById('messageInput');

const messagesDiv = document.getElementById('messages');

const statusDiv = document.getElementById('status');

// WebSocket实例

let socket = null;

// 连接按钮事件

connectBtn.addEventListener('click', () => {

if (socket && socket.readyState === 1) {

addMessage('已经连接到服务器', 'received');

return;

}

// 创建模拟WebSocket连接

socket = new MockWebSocket('ws://mock-server');

socket.onopen = (event) => {

statusDiv.textContent = '已连接';

statusDiv.className = 'status connected';

addMessage('已连接到服务器', 'received');

};

socket.onmessage = (event) => {

addMessage(event.data, 'received');

};

socket.onclose = (event) => {

statusDiv.textContent = '未连接';

statusDiv.className = 'status disconnected';

addMessage('与服务器断开连接', 'received');

};

socket.onerror = (error) => {

addMessage(`发生错误: ${error.message}`, 'received');

};

});

// 断开按钮事件

disconnectBtn.addEventListener('click', () => {

if (socket) {

socket.close();

socket = null;

}

});

// 发送按钮事件

sendBtn.addEventListener('click', () => {

sendMessage();

});

// 回车发送消息

messageInput.addEventListener('keypress', (e) => {

if (e.key === 'Enter') {

sendMessage();

}

});

// 发送消息函数

function sendMessage() {

const message = messageInput.value.trim();

if (message && socket) {

socket.send(message);

addMessage(message, 'sent');

messageInput.value = '';

} else if (!socket) {

addMessage('请先连接到服务器', 'received');

}

}

// 添加消息到显示区域

function addMessage(message, type) {

const messageElement = document.createElement('div');

messageElement.className = `message ${type}`;

messageElement.textContent = message;

messagesDiv.appendChild(messageElement);

messagesDiv.scrollTop = messagesDiv.scrollHeight;

}

</script>

</body>

</html>

相关推荐
xump3 小时前
如何在DevTools选中调试一个实时交互才能显示的元素样式
前端·javascript·css
折翅嘀皇虫3 小时前
fastdds.type_propagation 详解
java·服务器·前端
Front_Yue4 小时前
深入探究跨域请求及其解决方案
前端·javascript
wordbaby4 小时前
React Native 进阶实战:基于 Server-Driven UI 的动态表单架构设计
前端·react native·react.js
抱琴_4 小时前
【Vue3】我用 Vue 封装了个 ECharts Hooks,同事看了直接拿去复用
前端·vue.js
风止何安啊4 小时前
JS 里的 “变量租房记”:闭包是咋把变量 “扣” 下来的?
前端·javascript·node.js
Danny_FD4 小时前
用 ECharts markLine 标注节假日
前端·echarts
程序员西西4 小时前
SpringBoot无感刷新Token实战指南
java·开发语言·前端·后端·计算机·程序员
烛阴4 小时前
Luban集成CocosCreator完整教程
前端·typescript·cocos creator
有点笨的蛋4 小时前
深入理解 JavaScript 原型机制:构造函数、原型对象与原型链
前端·javascript