当前位置: 首页 > news >正文

如何查网站死链收费网站推广

如何查网站死链,收费网站推广,网络营销的基本职能,做网站需要用到ps吗一、前言 最近在学习WebSocket技术,做了一个简单的聊天室Demo。这个项目虽然不大,但涵盖了WebSocket的核心功能实现。下面我将详细介绍这个聊天室的实现过程,希望能帮助到同样想学习WebSocket的朋友们。 二、技术选型 后端:Spri…

一、前言

最近在学习WebSocket技术,做了一个简单的聊天室Demo。这个项目虽然不大,但涵盖了WebSocket的核心功能实现。下面我将详细介绍这个聊天室的实现过程,希望能帮助到同样想学习WebSocket的朋友们。

二、技术选型

  • 后端:Spring Boot + WebSocket

  • 前端:SockJS + STOMP.js

  • 通信协议:STOMP(简单的面向文本的消息协议)

三、后端实现

1. WebSocket配置类

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {@Overridepublic void configureMessageBroker(MessageBrokerRegistry config) {// 设置消息代理前缀config.enableSimpleBroker("/topic");// 设置应用目的地前缀config.setApplicationDestinationPrefixes("/app");}@Overridepublic void registerStompEndpoints(StompEndpointRegistry registry) {// 注册WebSocket端点registry.addEndpoint("/ws").setAllowedOriginPatterns("*").withSockJS(); // 支持SockJS}
}

2. 消息处理控制器

@Controller
public class WebSocketController {@MessageMapping("/hello")@SendTo("/topic/greetings")public String greeting(String message) {System.out.println("收到消息: " + message);return message;}
}

四、前端实现

完整代码:
 

<!DOCTYPE html>
<html>
<meta charset="UTF-8">
<head><title>WebSocket Chat Demo</title><script src="https://cdn.jsdelivr.net/npm/sockjs-client@1.6.1/dist/sockjs.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/stomp.js/2.3.3/stomp.min.js"></script><style>:root {--primary-color: #4CAF50;--secondary-color: #45a049;--error-color: #f44336;--border-color: #ddd;}body {font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;max-width: 800px;margin: 0 auto;padding: 20px;background-color: #f9f9f9;}h1 {color: #333;text-align: center;margin-bottom: 20px;}#chat-container {background-color: white;border-radius: 8px;box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);overflow: hidden;}#message-container {height: 400px;overflow-y: auto;padding: 15px;border-bottom: 1px solid var(--border-color);background-color: #fafafa;}.message {margin-bottom: 12px;padding: 10px 15px;border-radius: 18px;max-width: 70%;word-wrap: break-word;animation: fadeIn 0.3s ease;}.user-message {background-color: var(--primary-color);color: white;margin-left: auto;border-bottom-right-radius: 4px;}.server-message {background-color: #e5e5ea;color: black;margin-right: auto;border-bottom-left-radius: 4px;}#status {padding: 10px 15px;background-color: #f8f8f8;font-size: 14px;color: #666;text-align: center;border-bottom: 1px solid var(--border-color);}#message-form {display: flex;padding: 15px;background-color: white;}#message-input {flex-grow: 1;padding: 12px;border: 1px solid var(--border-color);border-radius: 4px;font-size: 16px;outline: none;transition: border 0.3s;}#message-input:focus {border-color: var(--primary-color);}#send-btn {padding: 12px 20px;margin-left: 10px;background-color: var(--primary-color);color: white;border: none;border-radius: 4px;cursor: pointer;font-size: 16px;transition: background-color 0.3s;}#send-btn:hover {background-color: var(--secondary-color);}#send-btn:disabled {background-color: #cccccc;cursor: not-allowed;}@keyframes fadeIn {from { opacity: 0; transform: translateY(5px); }to { opacity: 1; transform: translateY(0); }}.connection-status {display: inline-block;width: 10px;height: 10px;border-radius: 50%;margin-right: 5px;}.connected {background-color: var(--primary-color);}.disconnected {background-color: var(--error-color);}.timestamp {font-size: 12px;color: #999;margin-top: 4px;text-align: right;}</style>
</head>
<body>
<h1>WebSocket Chat Demo</h1><div id="chat-container"><div id="status"><span id="connection-status" class="connection-status disconnected"></span><span id="status-text">正在连接服务器...</span></div><div id="message-container"></div><form id="message-form"><input type="text" id="message-input" placeholder="输入消息..." autocomplete="off" autofocus><button type="submit" id="send-btn" disabled>发送</button></form>
</div><script>// 全局变量const socket = new SockJS('http://localhost:8080/ws');const stompClient = Stomp.over(socket);let username = '用户' + Math.floor(Math.random() * 1000);// DOM元素const messageContainer = document.getElementById('message-container');const messageForm = document.getElementById('message-form');const messageInput = document.getElementById('message-input');const sendBtn = document.getElementById('send-btn');const statusText = document.getElementById('status-text');const connectionStatus = document.getElementById('connection-status');// 初始化连接function connect() {updateStatus('正在连接服务器...', 'disconnected');// 禁用调试信息(生产环境)stompClient.debug = null;stompClient.connect({},function(frame) {onConnectSuccess(frame);},function(error) {onConnectError(error);});}// 连接成功回调function onConnectSuccess(frame) {updateStatus('已连接', 'connected');sendBtn.disabled = false;// 订阅消息stompClient.subscribe('/topic/greetings', function(response) {const message = JSON.parse(response.body);// 检查是否是自己的消息if (message.username !== username) {showMessage(`${message.username}: ${message.content}`, 'server-message');}});// 发送欢迎消息sendSystemMessage(`${username} 加入了聊天室`);}// 连接错误回调function onConnectError(error) {console.error('连接错误:', error);updateStatus('连接失败,5秒后重试...', 'disconnected');sendBtn.disabled = true;// 5秒后自动重连setTimeout(connect, 5000);}// 更新状态显示function updateStatus(text, status) {statusText.textContent = text;connectionStatus.className = 'connection-status ' + status;}// 显示消息function showMessage(content, messageType) {const messageElement = document.createElement('div');messageElement.className = `message ${messageType}`;const contentElement = document.createElement('div');contentElement.textContent = content;const timestampElement = document.createElement('div');timestampElement.className = 'timestamp';timestampElement.textContent = new Date().toLocaleTimeString();messageElement.appendChild(contentElement);messageElement.appendChild(timestampElement);messageContainer.appendChild(messageElement);messageContainer.scrollTop = messageContainer.scrollHeight;}// 发送用户消息function sendUserMessage() {const content = messageInput.value.trim();if (!content) return;// 显示用户消息showMessage(content, 'user-message');// 发送到服务器stompClient.send("/app/hello",{},JSON.stringify({username: username,content: content,timestamp: new Date().getTime()}));messageInput.value = '';}// 发送系统消息function sendSystemMessage(message) {showMessage(message, 'server-message');}// 事件监听messageForm.addEventListener('submit', function(e) {e.preventDefault();sendUserMessage();});// 回车发送消息messageInput.addEventListener('keypress', function(e) {if (e.key === 'Enter' && !e.shiftKey) {e.preventDefault();sendUserMessage();}});// 初始化connect();// 窗口关闭前发送离开消息window.addEventListener('beforeunload', function() {if (stompClient.connected) {sendSystemMessage(`${username} 离开了聊天室`);}});
</script>
</body>
</html>

JavaScript核心代码

// 初始化连接
const socket = new SockJS('http://localhost:8080/ws');
const stompClient = Stomp.over(socket);// 连接成功回调
function onConnectSuccess(frame) {updateStatus('已连接', 'connected');sendBtn.disabled = false;// 订阅消息stompClient.subscribe('/topic/greetings', function(response) {const message = JSON.parse(response.body);// 检查是否是自己的消息if (message.username !== username) {showMessage(`${message.username}: ${message.content}`, 'server-message');}});
}// 发送消息
function sendUserMessage() {const content = messageInput.value.trim();if (!content) return;// 显示用户消息showMessage(content, 'user-message');// 发送到服务器stompClient.send("/app/hello",{},JSON.stringify({username: username,content: content,timestamp: new Date().getTime()}));
}

五、遇到的问题及解决方案

问题:消息重复显示

现象:自己发送的消息会显示两次

原因

  1. 前端发送后立即显示

  2. 服务器广播后又显示一次

解决方案

stompClient.subscribe('/topic/greetings', function(response) {const message = JSON.parse(response.body);// 只显示别人发的消息if (message.username !== username) {showMessage(`${message.username}: ${message.content}`, 'server-message');}
});

六、项目特点

  1. 简单易用:代码简洁,适合初学者理解WebSocket原理

  2. 实时通信:基于WebSocket实现真正的双向通信

  3. 自动重连:网络断开后会自动尝试重新连接

  4. 用户区分:每个用户有随机生成的唯一用户名

七、总结

这个简单的WebSocket聊天室Demo虽然功能不多,但涵盖了WebSocket的核心功能。通过这个项目,我学到了:

  1. WebSocket的基本工作原理

  2. STOMP协议的使用方法

  3. 前后端如何通过WebSocket进行实时通信

  4. 如何处理常见的消息回显问题

如果想扩展功能,可以考虑添加:

  • 用户列表显示

  • 私聊功能

  • 消息历史记录

  • 图片/文件传输


未来计划:

Ai 聊天室   --- 未来可期

http://www.dtcms.com/a/442394.html

相关文章:

  • 最好的图像编辑器有哪些?
  • 【开题答辩实录分享】以《基于Python的旅游网站数据爬虫研究》为例进行答辩实录分享
  • 深圳网站建设 设计科技网站维护属于什么部门
  • DAY25 综合案例
  • 计算机网络(三):物理层(通信基础、传输介质、物理层设备)
  • app优化网站怎么用手机搭建网站
  • 郑州网站建设灵秀网店代运营怎么做
  • 宝塔环境下upload目录按月增量同步至阿里云OSS自动化脚本
  • 公域流量转化困境下开源AI智能名片与链动2+1模式的S2B2C商城小程序应用研究
  • YOLO算法原理详解系列 第001期-YOLOv1 算法原理详解
  • 竞赛管理系统|基于SpringBoot和Vue的竞赛管理系统(源码+数据库+文档)
  • 镇江网站建设包括哪些传媒网站后台免费模板
  • linux学习笔记(13)文件操作
  • 爬虫反反爬1
  • 网站建设包括哪些服务济宁住房和城乡建设厅网站首页
  • 网站cms大全九江学网站建设
  • 【ROS2学习笔记】参数
  • 网站建设哪儿好营销策划方案的目的
  • 近世代数(抽象代数)详细笔记--群
  • Drawio 在软件开发中的应用实践:从 BPMN 编排到 Serverless 工作流自动部署
  • 鸿蒙NEXT系列之鸿蒙PC真机部署应用
  • 如何网上建设网站wordpress调用所有的标签
  • Go语言:Go 语言中的命令行参数操作详解
  • 做平台好还是自己建网站河北建设工程信息网公告怎么查询
  • 免费网站一级a做爰在免费线看网站优化能发外链的gvm网站大全
  • 详解Kafka2-进阶机制
  • 嵌入式开发学习日志34——stm32之RTC实时时钟系统
  • 蓝桥杯单片机进阶教程——蜂鸣器继电器
  • 美发店收银系统售后
  • 力扣hot100 | 动态规划2 | 139. 单词拆分、300. 最长递增子序列、152. 乘积最大子数组、416. 分割等和子集、32. 最长有效括号