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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

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

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

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

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

win10配置JAVA和tomacat环境变量

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

设计模式 策略模式2 c++11

根据需求的不同 选择不同的策略算法 之前是保存的各种策略类的指针 这里直接使用 function bind 选择对应的算法 代码 // 005.cpp: 定义控制台应用程序的入口点。 //#include "stdafx.h" #include <functional> #include <iostream>using namespace std…

python学习(八)定制类和枚举

python定制类主要是实现特定功能&#xff0c;通过在类中定义特定的函数完成特定的功能。 class Student(object):def __init__(self, name):self.name namestudent Student("lilei") print(student) 实现定制类 class Student(object):def __init__(self, name):sel…

架构实战:(一)Redis采用主从架构的原因

架构实战 &#xff08;一&#xff09;Redis采用主从架构的原因 &#xff08;二&#xff09; 如果系统的QPS超过10W&#xff0c;甚至是百万以上的访问&#xff0c;则光是Redis是不够的&#xff0c;但是Redis是整个大型缓存架构中&#xff0c;支撑高并发的架构非常重要的环节。 首…

《JavaWeb从入门到改行》注册时向指定邮箱发送邮件激活

javaMail API javaMail是SUN公司提供的针对邮件的API 。 两个jar包 mail.jar 和 activation.jar java mail中主要类&#xff1a;javax.mail.Session、javax.mail.internet.MimeMessage、javax.mail.Transport。 Session 表示会话&#xff0c;即客户端与邮件服务器之…

HTTP之报文

HTTP 报文 用于 HTTP 协议交互的信息被称为 HTTP 报文。请求端&#xff08;客户端&#xff09;的 HTTP 报文叫做请求报文&#xff0c;响应端&#xff08;服务器端&#xff09;的叫做响应报文。HTTP 报文本身是由多行&#xff08;用 CRLF 作换行符&#xff09;数据构成的字符串文…

python 内置函数

一 print( ) flush的应用——模拟进度条 import time for i in range(1,101):time.sleep(0.1)print(\r{}%:{}.format(i,**i),end,flushTrue) #\r &#xff08;return&#xff09; 表示回车 \n &#xff08;new line&#xff09;表示换行&#xff0c;实际上是回车换…

Discuz!论坛实现帖子回复可见内容功能

自从Discuz&#xff01;升级到3.0以上的时候很多功能都被改版了&#xff0c;已不是2年前的设计&#xff0c;如果不是Discuz&#xff01;老用户还真不知道怎么玩它了。 博主以前经常逛论坛&#xff0c;但从来没有自己去做过一个论坛&#xff0c;相关的开源程序代码也不是怎么精通…

dropify,不错的图片上传预览插件

引言 传统的图片上传&#xff0c;很丑。点击选择之后&#xff0c;还无法预览。 有一种方案是传到服务器&#xff0c;然后返回地址&#xff0c;然后显示&#xff0c;比较麻烦。 用这个dropify&#xff0c;就可以解决之歌问题。 看效果 用法 1.引入文件,需要jquery支持。 <lin…

【知了堂学习笔记】MySQL数据库常用的SQL语句整理

一&#xff0c;常用、简单的SQL操作语句 1.数据库操作&#xff1a; 1&#xff09;创建数据库&#xff1a; create database database_name&#xff1b; 创建并设置字符编码 create database database_name character set utf8&#xff1b; 2&#xff09;删除数据库&#xff1a…

tomcat原理解析(一):一个简单的实现

一 概述 前段时间去面试&#xff0c;被人问到了tomcat实现原理。由于平时没怎么关注容器的实现细节&#xff0c;这个问题基本没回答上来。所以最近花了很多时间一直在网上找资料和看tomcat的源码来研究里面处理一个HTTP请求的流程。网上讲tomcat的帖子比较多&#xff0c;大多都…

手风琴案例jquery写法

今天我用jquary来写一下手风琴案例&#xff0c;这个案例在平时的项目中很经常会见到&#xff0c;要想实现效果用jquary来写其实很简单&#xff0c;其实一句话就是jquary的方法的调用。 首先我们先来分析一下手风琴案例实际实现的效果&#xff0c;就是点击当前的标题&#xff0c…

元组tuple

另一种有序列表叫元组&#xff1a;tuple。tuple和list非常类似&#xff0c;但是tuple一旦初始化就不能修改&#xff0c;比如同样是列出同学的名字&#xff1a; >>> classmates (Michael, Bob, Tracy)现在&#xff0c;classmates这个tuple不能变了&#xff0c;它也没有…

win7下的nginx小demo

一直大概知道nginx怎么玩,但是不看文档又蒙蔽.在这记录一下,以后好查看 下载tomcat,改index.jsp http://tomcat.apache.org/download-80.cgi tomcat9已经出来了,但是自己用了一次,闪退,换tomcat8,开启成功.(tomcat9这个原因有时间在琢磨) 修改tomcat的index.jsp 然后在index.js…

understand的安装

1.win7 64位下安装 1&#xff09;下载Understand.4.0.908.x64.rar。 2&#xff09;解压之&#xff0c;直接运行里面的Understand-4.0.908-Windows-64bit.exe。 3&#xff09;选择如下 之后&#xff0c;点击“Add Eval or SDL (RegCode)”&#xff0c;如下图&#xff1a; 4&…