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

websoket

WebSockets 是一种先进的技术。它可以在用户的浏览器和服务器之间打开交互式通信会话。你可以向服务器发送消息并接收事件驱动的响应,而无需通过轮询服务器的方式以获得响应,比较典型的应用场景就是即时通讯(聊天)系统。

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>WebSocket 示例</title></head><body><script>// 实例化 socketconst ws = new WebSocket('wss://socketsbay.com/wss/v2/1/demo/')// 监听连接的建立ws.onopen = function (ev) {console.log('建立连接...')ws.send('Hello WebSockets!')}// 监听连接的断开ws.onclose = function (ev) {console.log('断开连接...')}// 监听 socket 服务器消息ws.onmessage = function (ev) {console.log('收到消息: ' + ev.data)}</script></body>
</html>

Socket.IO 是基于 WebSocket 进行的二次封装,封装了更多的业务层面的逻辑,如身份认证等、事件驱动等。

注:其实 Socket.IO 不仅仅是封装了 WebSocket,还有基于 Ajax 的长轮询机制,在不支持 WebSocket 的环境中会自动降级为基于 Ajax 的长轮询机制。

长轮询机制可以粗暴的理解为在一个定时器中不断的重复发 Ajax 请求,以实现与服务器实时通信的功能。

客户端代码

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>socket.io 示例</title>
</head><body><button id="myButton">点击</button><!-- <script src="node_modules/socket.io/client-dist/socket.io.js"></script> --><script src="https://cdn.socket.io/4.4.1/socket.io.min.js"></script><script>// 实例化const socket = io('http://localhost:3000', {transports: ['websocket'],})socket.on('connect', () => {console.log('建立连接...')})socket.on('disconnect', () => {console.log('断开连接...')})socket.on('sendToClient', (msg) => {console.log('收到来自服务器数据: ' + msg)})var myButton = document.getElementById('myButton');myButton.addEventListener('click', function () {socket.emit('sendToServer', '的花花世界是江苏省靖江市就是')});</script>
</body></html>

服务端代码

// server.js
import { createServer } from 'http'
import { Server } from 'socket.io'
import path from 'path'const server = createServer()
const io = new Server(server)// websocket
io.on('connection', (client) => {console.log('建立连接...')// 消息发送client.on('sendToServer', (msg) => {console.log('收到了客户端的数据: ' + msg)// 随机返回一条消息const messages = ['你好!', '我在写代码', '快下课了吧?']// 0 ~ 2 随机数据const index = Math.floor(Math.random() * 3)// 向客户端回复消息io.emit('sendToClient', messages[index])})// 断开连接client.on('disconnect', () => {console.log('断开连接...')})
})server.listen(3000, () => {console.log('server start')
})
http://www.lryc.cn/news/305623.html

相关文章:

  • 案例:微服务从Java/SpringBoot迁移到Golan
  • 小波变换模拟
  • cv::Mat图像操作
  • 【机器学习基础】一元线性回归(适合初学者的保姆级文章)
  • 2024年软件测试岗位-面试
  • 【坑】Spring Boot整合MyBatis,一级缓存失效
  • J7 - 对于ResNeXt-50算法的思考
  • R3F(React Three Fiber)基础篇
  • torch\tensorflow在大语言模型LLM中的作用
  • 设计模式-创建型模式-单例模式
  • 备战蓝桥杯—— 双指针技巧巧答链表1
  • 微信小程序返回上一级页面并自动刷新数据
  • Spring⼯⼚创建复杂对象
  • Top-N 泛型工具类
  • Java 后端面试指南
  • 142.环形链表 ||
  • Nacos、Eureka、Zookeeper注册中心的区别
  • CSS重点知识整理1
  • 【Langchain多Agent实践】一个有推销功能的旅游聊天机器人
  • 算法学习(十二)并查集
  • TensorRT及CUDA自学笔记003 NVCC及其命令行参数
  • 数据库管理-第154期 Oracle Vector DB AI-06(20240223)
  • 解决uni-app vue3 nvue中使用pinia页面空白问题
  • 不用加减乘除做加法
  • 旅游组团自驾游拼团系统 微信小程序python+java+node.js+php
  • LeetCode 第41天 | 背包问题 二维数组 一维数组 416.分割等和子集 动态规划
  • Ubuntu20.04和Windows11下配置StarCraft II环境
  • 【NCom】:通过高温气相合成调节Pt-CeO2相互作用以提高晶格氧的还原性
  • git 将一个分支的提交移动到另一个分支
  • vue3 实现 el-pagination页面分页组件的封装以及调用