ajax轮询模拟websocket,Ajax轮询和SSE服务器推送数据与websocket模式的区别性学习

我们试想一下我们做个实时聊天的窗口有几种方法?

在我们不刷新页面并且可以试试更新页面内容的方法 你这时候是不是想到了ajax没错确实可以

Ajax轮询

什么是轮询?顾名思义就是我轮着问你,规定一个时间然后我就问你 有新数据了吗? 有新数据了吗? 有新数据了吗? 当有新数据的时候就更新页面。

但是性能会很差。。。

并且这是前台操作的 后端只需要查询数据库 设置好路由即可

Node后端

简单的说就是 后端设置一个路由然后进行查询数据获取想要的数据的操作

const Koa = require("koa");

const static = require("koa-static");

const Router = require("koa-router");

const mysql2 = require("mysql2");

const koaBody = require("koa-body");

let app = new Koa();

app.use(static(__dirname+"/static"));

app.use(koaBody());

//连接数据库

const connection = mysql2.createConnection({

host:"localhost",

user:"root",

password:"123",

database:"js04"

})

let router = new Router();

//访问此路由进行获取数据

router.get("/getData",async ctx=>{

let [rows] = await connection.promise().query("SELECT * FROM message");

ctx.body = rows;

})

app.use(router.routes());

app.listen(3000);

前端

前端我要访问这个路由然后获取数据 而ajax 是不会刷新页面的。

$.ajax({

//访问路由

url: "/getData",

success(res) {

//res 就是回的数据

console.log(res);

}

})

怎么进行轮询呢?

上面我们说什么 规定一个时间然后 每隔多长时间进行询问

那么这不就是定时器吗

我们将上面的ajax进行封装成方法里面 然后用定时器进行 轮询访问获取数据

setInterval(() => {

render();

}, 500);

这样我们是服务器资源很浪费会一直的进行访问api进行获取数据

1ee32437f9ea95033a878f88ba307b87.png

我们说了 客户端不断的向服务端进行询问那么有没有 服务端主动向 客户端进行发送消息的呢 ?

SSE (server send event) 服务器推送数据

其是基于http协议的,本质上是保持一个http长连接,客户端向服务端发送请求,在浏览器与服务器建立连接之后,等有数据更新后,服务端向浏览器主动发送消息。这样可以减少数量,减少服务器压力。

而在我们服务端使用sse的时候要进行一些设置

设置头部

"Content-type","text/event-stream"

返还数据格式

​ data: 声明数据开始

​ \r\n\r\n 标志数据结尾

服务器端Node

我们设置两个路由一个是返回首页 第二个路由是进行一些数据的返回也就是使用sse

const http = require("http");

const fs = require("fs");

// res.write(); res.end();

let server = http.createServer((req,res)=>{

let url = req.url;

//路由返回页面

if(url=="/"){

let data = fs.readFileSync("index.html");

res.end(data);

}else if(url=="/sse"){

res.setHeader("content-type","text/event-stream;charset=utf-8");

// 服务端端定时推送数据到客户端;

setInterval(() => {

res.write("data:时间是"+new Date()+"\r\n\r\n");

}, 1000);

}

})

server.listen(4000);

客户端

我们需要创建一个 EventSource对象 然后在这个对象里面有几个事件

open:当成功建立连接时产生

message:当接收到消息时产生

error:当出现错误时产生

let source = new EventSource("/sse");

source.onopen = function(){

console.log("连接成功....");

console.log(source.readyState);

//这里的 readyState 会有几种状态

//- 0 CONNECTING (0)

//- 1 OPEN (1)

//- 2 CLOSED (2)

}

source.onmessage = function(e){

console.log("获取到的数据是:",e.data);

document.querySelector(".exchange").innerHTML = e.data;

}

source.onerror = function(err){

return console.log(err);

}

这里的 readyState 会有几种状态

CONNECTING (0)

OPEN (1)

CLOSED (2)

以上的两种方法虽然都能实现但是对性能都不是比较的友好 有没有更好的解决方案呢?

websocket

WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议

浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

我们后端使用的是 Node 所以我们需要借助 ws 模块创建 websocket 实例

ws是一种易于使用,快速且经过全面测试的WebSocket客户端和服务器实现的方法。

安装npm install ws

简单使用

首先我们需要导入ws并调用Server 服务端

我们进行设置端口

服务端

var WebSocketServer = require('ws').Server,

wss = new WebSocketServer({ port: 8181 });

wss.on('connection', function (ws){

console.log('client connected');

ws.on('message', function (message){

//监听接收的数据

console.log(message);

});

// setInterval(() => {

let somedata = {

name:"张三",

age:20

}

//发送数据

ws.send(JSON.stringify(somedata));

// }, 1000);

});

客户端

建立握手

var ws = new WebSocket("ws://localhost:8181");

打开协议

ws.onopen = function (){}

发送数据到服务端

ws.send("客户端数据");

关闭协议:关闭协议后不能发送数据

ws.close();

接收消息

ws.onmessage = function(e){

// console.log(e.data);

}

完整点的代码

// 握手协议;

var ws = new WebSocket("ws://localhost:8181");

ws.onopen = function(){

console.log("连接成功....");

}

ws.onmessage = function(e){

// console.log(e.data);

console.log(JSON.parse(e.data));

}

function sub(){

ws.send("发送到服务端的数据");

}

6ead67747c1605d5c7092a9de0dd0fc3.png

整体就是简单的了解客户端与服务端之间的交互问题后面会更加详细的进行学习

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/428827.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1026 程序运行时间 (15 分)

1026 程序运行时间 (15 分) 简单题。 #include<iostream> #include<cmath> #include<iomanip> using namespace std; int main() {int a,b,c;cin>>a>>b;if((b-a)%100>0&&(b-a)%100<50) c(b-a)/100; else c(b-a)/1001;cout<&l…

文字超出两行 则显示。。。

overflow: hidden; text-overflow: ellipsis; display: box; display: -webkit-box; line-clamp: 2; -webkit-line-clamp: 2; -webkit-box-orient: vertical; 转载于:https://www.cnblogs.com/zcboy/p/7435917.html

vue项目前端服务器,【前端技术】vue自动部署项目到服务器

想要的功能前端打包之后自动上传文件夹到服务器在不提交代码的前提下&#xff0c;也可以完成上述功能经过各种百度谷歌&#xff0c;最后有两种方案可以选择第一种是写一个shell&#xff0c;通过lftp上传文件夹&#xff0c;但是会有个权限的问题&#xff0c;需要更改nginx配置才…

1027 打印沙漏 (20 分)

1027 打印沙漏 (20 分) 简单题。 #include<iostream> #include<string> #include<math.h> using namespace std; int main() {int n;char ch;cin>>n>>ch;int i;for (i1;;i){if (2*i*i-1>n) {ii-1;break;}}for (int j1;j<2*i;j){for (int…

你所不了解的五条面试忠告

今天不聊代码也不谈架构&#xff0c;今天我只想说说对每个人来说都必不可少又并非最重要的工作环节之一——面试。 几乎各大培训结构在他们的学员即将毕业的时候都会开一两节有关面试的课程&#xff0c;无非是教大家如何因对考官的问题或者如何在一些冷门知识上回答让对方满意。…

官狼服务器临时维护,官狼三分钟新模式,跑跑狼人杀如何边跑边杀

作为风靡全球的桌游&#xff0c;狼人杀一度成为了国内白领、学生党的国民游戏。随着网络的普及&#xff0c;很多玩家开始转求线上网杀&#xff0c;网易《狼人杀官方》因为玩法最多画风好看&#xff0c;一直是大多数人的选择。而就在最近&#xff0c;《狼人杀官方》重磅推出了年…

二叉搜索树相关题目

//二叉查找树的第k大节点&#xff1a;利用二叉搜索树的中序遍历序列是递增排序的性质&#xff0c;递归实现 struct BinaryTreeNode{int m_nValue;BinaryTreeNode* m_pLeft;BinaryTreeNode* m_pRight; }; BinaryTreeNode* FindKthNodeCore(BinaryTreeNode* pRoot, unsigned int …

三星s6 信号无服务器,手机没信号的原因以及解决方法

现在手机是一件很普遍的通讯工具&#xff0c;因为现在手机功能的强大&#xff0c;所以基本上人人一部手机。目前在社会上比较流行的牌子就是苹果或者三星手机。不过想必大家在用手机的时候都会出现手机没有信号这个问题。这个问题是一件比较麻烦的问题&#xff0c;有的时候急需…

2017书单3

30.围城 钱钟书的一部经典文学作品&#xff0c;只在高中刚开学的时候读过一点&#xff0c;听当时的老帅、班主任王家友讲过一点。王老师的音容笑貌依然在心呀&#xff01;话说这本书&#xff0c;写的是出国留洋的方鸿进&#xff0c;买了野鸡大学的假文凭后的一系列遭遇&#xf…

不同型号服务器如何做双击热备,服务器做双机热备教程

服务器做双机热备教程 内容精选换一换将GaussDB(DWS)提供的ODBC DRIVER(psqlodbcw.so)配置到数据源中便可使用。配置数据源需要配置“odbc.ini”和“odbcinst.ini”两个文件(在编译安装unixODBC过程中生成且默认放在“/usr/local/etc”目录下)&#xff0c;并在服务器端进行配置…

143. 最大异或对

模板&#xff1a;tire 复杂度&#xff1a;O&#xff08;nlogn&#xff09; 143. 最大异或对 #include <iostream> #include <algorithm> using namespace std; const int maxn 100010, M 31 * maxn; int ch[maxn]; int n; int son[M][2], idx 0; void insert(i…

windows service 2008 内存吃尽解决方案

最近用windows2008&#xff0c;发现系统运行一段时间后&#xff0c;内存吃紧&#xff0c;赶紧打开资源查看器&#xff0c;发现当前运行的程序占有内存都很小&#xff0c;后经查资料&#xff0c;原来是被windows2008的文件缓存吃尽了&#xff0c;这是windows2008的新机制&#x…

文档上传到服务器上,将文件上传到服务器上

将文件上传到服务器上 内容精选换一换为了实现NAT Server、SAP HANA主备节点和SAP S/4HANA主备节点互相通过SSH协议跳转的功能&#xff0c;需要配置云服务器之间的互信。在本地PC上&#xff0c;生成登录NAT Server的密钥文件。在创建NAT Server时&#xff0c;指定了NAT Server的…

深入理解C# 静态类与非静态类、静态成员的区别 [转载]

静态类静态类与非静态类的重要区别在于静态类不能实例化&#xff0c;也就是说&#xff0c;不能使用 new 关键字创建静态类类型的变量。在声明一个类时使用static关键字&#xff0c;具有两个方面的意义&#xff1a;首先&#xff0c;它防止程序员写代码来实例化该静态类&#xff…

win10配置JAVA和tomacat环境变量

一、配置JAVA_HOME 二、配置CATALINA_HOME &#xff08;tomacat的环境变量&#xff09; 三、配置PATH 四、命令行检验配置结果&#xff1a; 1、命令行输入java 2、命令行输入javac 3、命令行输入startup.bat 注&#xff1a;如果以上三个命令无报错表示配置成功 转载于:https://…

1032 挖掘机技术哪家强 (20 分)

1032 挖掘机技术哪家强 (20 分) #include<iostream> using namespace std; int main() {int n,k,h,ch[100101]{0},hh0,hhh1;cin>>n;for (int i0;i<n;i){cin>>k>>h;ch[k]h;if (ch[k]>hh) {hhch[k];hhhk;}}cout<<hhh<<" "&…

E20170830-mk

translation n. 翻译; 译本; 转化; 转变; calculate vt. 计算; 估计; 打算&#xff0c;计划; 旨在;erase vt. 抹去; 清除; 擦掉;转载于:https://www.cnblogs.com/lancgg/p/8281741.html

1033 旧键盘打字 (20 分)

1033 旧键盘打字 (20 分) #include<iostream> using namespace std; int main() {int ch[1011]{0};string str1,str2;getline(cin,str1);getline(cin,str2);int len1str1.length(),len2str2.length();for (int i0;i<len1;i) {if (str1[i]>A&&str1[i]<Z…

3485. 最大异或和

最大异或和 #include <iostream> #include <algorithm> using namespace std; const int maxn 100010, M 31 * maxn; int ch[maxn]; int n; int son[M][2], idx 0; int cnt[M];//M一定要这么大 void insert(int x, int v) {int p 0;for (int i 30; ~i; i--){…

B. Sifid and Strange Subsequences

B. Sifid and Strange Subsequences A sequence (b1,b2,…,bk) is called strange, if the absolute difference between any pair of its elements is greater than or equal to the maximum element in the sequence. Formally speaking, it’s strange if for every pair (…