WebSocket介绍

React项目中实现websocket 问题 如何让服务器主动给客户端发请求? HTTP协议(ajax)的缺陷 WebSocket 是一种数据通信协议,类似于我们常见的 http 协议。 初次接触 WebSocket 的人,都会问同样的问题:我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处? 答案很简单,因为 HTTP 协议有一个缺陷:通信只能由客户端发起。http基于请求响应实现。 举例来说,我们想了解今天的天气,只能是客户端向服务器发出请求,服务器返回查询结果。HTTP 协议做不到服务器主动向客户端推送信息。 阅读详情

WebSocket

HTML5开始提供的一种浏览器与服务器进行全双工通讯的网络技术,属于应用层协议。它基于TCP传输协议,并复用HTTP的握手通道。

简单来说,WebSocket就是一种实现双向通信的长连接方案,双方可以随时互发消息,常用于聊天、协同编辑等场景。除了WebSocket,常用的长连接方案还有一下几种:

  1. Server-Sent Events (SSE): 客户端通过HTTP请求与服务器建立连接,可以主动向客户端推送消息。适合单向通讯场景。

  2. 短轮询(Short Polling): 原理非常简单,客户端每隔几秒发一个请求,询问服务器是否有新消息。

  3. 长轮询(Long Polling,comet): 和短轮询差不多,但在返回前会阻塞客户端向服务器发送一个HTTP请求,服务器一直保持连接处于挂起状态。

  4. iframe流:利用iframe的长连接特性,从服务器实时获取数据并推送到客户端页面。同样适用于实时推送场景,维护难度大。

可以看出这几种方案都是客户端主动发起连接,服务器在这里是完全被动的。不管是长轮询还是短轮询其实都非常耗费资源,需要服务器有足够的处理能力和足够高的并发。而且HTTP是非状态性的,除了真正的数据部分外,服务器和客户端还要大量交换 HTTP header,会浪费非常多的性能和流量。

而Websocket只需要建立一次连接,它是持久的,服务端会一直持有你的信息,直到交互完成连接关闭,实现了真正的长连接。

HTTP的另一个主要缺点是它是半双工的。半双工通信的特点是在同一时刻数据只能单向流动,客户端的请求流向服务器,服务器的响应流向客户端,始终是一来一回的过程。WebSocket是全双工的,客户端和服务器的数据可以同时双向流动,彻底解决了服务器的被动问题。

作用

WebSocket的优点:支持双向通信,更灵活,更高效,可扩展性更好。

WebSocket的主要问题是容易断线,如果一段时间不发数据,很可能会失效。所以一定要在代码里处理好重连的问题防止翻车,一般会用心跳( Ping/Pong)保活来维持中间网络的连接状态。至于浏览器兼容问题,现在基本可以忽略不计了,IE11也可以支持WebSocket。

应用

全量API网址:WebSocket - Web APIs | MDN

一般也不会直接用API,只需了解几个主要事件

readyState

readyState属性返回实例对象的当前状态,共有四种:

  • CONNECTING:值为0,表示正在连接。

  • OPEN:值为1,表示连接成功,可以通信了。

  • CLOSING:值为2,表示连接正在关闭。

  • CLOSED:值为3,表示连接已经关闭,或者打开连接失败。

onopen

连接成功后的回调函数

onclose

关闭成功后的回调函数

onmessage

收到服务器推送后的回调函数

send

向服务器推送

onerror

出现错误时的回调函数

socket.io

超好用的库,官方网址:Socket.IO

socketIO支持 WebSocket 协议,但要注意的是它**不是真正的WebSocket 实现,WebSocket 客户端无法连接SocketIO 服务器, SocketIO 客户端也无法连接普通 WebSocket 服务器!**双方都需要使用SocketIO 。

另外,SocketIO默认支持两种连接方式,优先使用polling,如果想使用websocket需要指定transports参数。

// 以下格式无法连接,默认使用polling连接
const socket = io("ws://echo.websocket.org");
// 指定websocket的连接方式
var socket = io('ws://localhost:4000', {transports: ['websocket']}); // 只用websocket
var socket = io("ws://localhost:4000", {
  transports: ["websocket", "polling"] // websocket优先
});

socketIO的特点

  • 自动回退:如果无法建立 WebSocket 连接,连接将回退到 HTTP 长轮询。

  • 自动重连:内含心跳保活,定期检查连接状态,意外中断时自动发起重连

  • 自动缓冲:当连接中断时,所有事件都会被延迟直到重连(不过可能会导致重连时发生大量事件,socketIO提供volatile解决这个问题)

  • 多路复用:允许通过命名空间区分拆分应用程序的逻辑

事件

发送(emit)和监听(on)

SocketIO模仿Node.js的EventEmitter,将发送事件称为emit。emit的第一个参数指定事件名称,其余参数指定事件参数,接收端通过on监听事件。它支持大部分数据类型,自动进行JSON.stringify()转换。只有部分类型需要手动序列化,具体参考发送事件 | Socket.IO

emit还可以传递回调函数,在SocketIO称为确认。只需将回调函数作为emit的参数传递即可。

// 服务器
socket.emit("update item", "1", { name: "updated" }, (response) => {});
// 客户端
socket.on("update item", (arg1, arg2, callback) 

可以为emit指定超时时间,如socket.timeout(5000).emit。对于不想缓冲到重连成功时推送,而是仅在服务器连接时发送的数据(比如实时上报位置等),使用socket.volatile.emit

广播(broadcast)和房间(room)

一般的emit是同时推送给所有客户端,broadcast可以推送给除了发送端的其余客户端。

socket.broadcast.emit("hello", "world");

Room 是一个服务器端概念,允许将数据广播到客户端的子集。

总结

基于 HTTP 的技术往往在服务器上占用更多资源,而 WebSocket 在服务器上的占用空间非常小。在实时、持续通信的场景,WebSocket 是更好的选择。

总的来说,WebSocket 和HTTP的选择依赖于业务需要的更新频率,如果需要以秒为单位更新,WebSocket更好。如果更新频率延长到半小时,则建议用短轮询。

WebSocket 前端深入介绍 WebSocket 是一个先进的技术,它使得在用户的浏览器和服务器之间可以开启一个交互式通信会话。使用WebSocket API,你可以向服务器发送消息并接收基于事件的响应,而无需轮询服务器获取新数据。 阅读详情

相关推荐

egret WebSocket的使用介绍

WebSocket的使用 应用介绍 WebScoket 与 Socket 的区别在于前者提供了完善的API以及握手的机制,而后者是抽象出来的一种概念。 WebSocket在现在egret中应用非常广泛,之前接触的所有的游戏都使用webSocket进行通信, 除了最近接手的这个是使用http进行的。 WebSocket的优点: Websocket解决了HTTP的上述难题,可以参考上一篇博客。...

Smart_home的博客 2740

IE10、IE11中WebSocket报错:SecurityError

IE是从10版本开始支持WebSocket的,但是我在js中写完WebSocket后,其他浏览器可以正常运行,但是到IE就报错,查了一圈后仍然没有解决这个错误,最后发现:WebSocket的协议ws与wss的区别,这类比于http与https,而我的后端又做了SSL,所以请求地址中是https,相应的js中的WebSocket的协议也应该是wss,改完之后立马就可以了。 之前是:var webSocket = new WebSocket('ws://127.0.0.1:9100'); 修改后:var w

fanfanfan的博客 6219

无线图像传输新突破:深度JSCC算法在低带宽环境下的性能实测

本文深入探讨了基于深度学习的信源信道联合编码(JSCC)算法在低带宽无线图像传输中的突破性表现。通过实测数据对比,深度JSCC在低信噪比环境下展现出卓越的鲁棒性,有效对抗传统方案的“悬崖效应”,实现图像质量的平滑下降,为远程医疗、工业巡检等严苛场景提供了新的解决方案。

weixin_29090089的博客 504

解决webSocket不兼容IE浏览器问题

解决webSocket不兼容IE浏览器问题浏览器问题解决办法 浏览器问题 webSocket这一通信方式随着html5而来,但在浏览器支持上会有一些问题 有一些方法可以通过降级的方式去做兼容,为了适应一些浏览器,如一些低版本的IE。 但现在IE11也是很普遍的,肯定会有遇到 IE11不能正常运行webSocket的问题。 解决办法 IE11浏览器是可以支持webSocket的,如果你正在用IE11...

qq_39541526的博客 1万+

Ubuntu22.04+PX4+Gazebo:从零到一构建无人机仿真开发环境

本文详细介绍了在Ubuntu22.04系统下搭建PX4+Gazebo无人机仿真开发环境的完整流程。从基础环境配置、PX4固件安装到Gazebo仿真环境搭建,提供了实用命令和常见问题解决方案,帮助开发者快速构建高效的无人机开发环境。

weixin_29243279的博客 434

从零到一:手把手教你用C#开发AGV调度系统(附避坑指南)

本文详细介绍了如何使用C#开发高效的AGV调度系统,涵盖从环境搭建到核心算法实现的完整流程。重点解析了动态路径规划、多机协同等关键技术,并提供了实用的避坑指南和性能优化建议,帮助开发者快速构建工业级车辆控制调度系统。

blockchain9miner的博客 741

几种常见的长连接实现方案

在业务系统设计方案中,长连接是一个比较有挑战的一块,长连接会有很多优势,但要怎么选择长连接技术方案呢?

nanxijms的博客 8768

Linux 命令之 localectl -- 控制系统的本地化与键盘布局

文章目录命令介绍常用选项参考示例(一)显示当前的本地化设置与键盘映射(二)设置系统的本地化字符集环境变量(三)列出本地所有字符集(四)列出所有可用的控制台键盘映射(五)设置控制台的键盘映射 命令介绍 localectl 命令可用于查询与修改系统的本地化(locale)与键盘布局的设置。 它通过与 systemd-localed.service 通信来修改例如 /etc/locale.conf 与 /etc/vconsole.conf 之类的配置文件。本地化设置控制着 用户界面的语言、字符类型与字符编码、 日

liaowenxiong的博客 5394

websocket 访问支持IE11

修改ws://localhost:81为ws://127.0.0.1:81即可,亲测有效。

stranger_we的专栏 3908

飞控算法-姿态解算之互补滤波

飞控乱入之姿态解算 姿态解算是通过读取各个传感器的数据进行融合最终得到当前飞行器的姿态,姿态通常用Euler角(Roll-Pitch-Yaw)来表示 姿态解算框架 姿态解算的数据源可来自于陀螺仪或加速度计,他们分别都可以得到当前姿态,但实际上他们都有各自的传感器性能的优缺点,需要取长补短,进行数据融合才能得到真实的姿态,这种方法简称 互补滤波 算法 传感器特性 互补滤波 姿态解...

GoolyOh的专栏 1万+

无人驾驶感知融合——横摆角速度的多源估计算法解析

本文深入解析了无人驾驶感知融合中的横摆角速度多源估计算法,详细介绍了轮速差法、侧向加速度法、曲率法和惯性传感器直读法四种计算方法及其优缺点。通过卡尔曼滤波实战案例,展示了多源融合算法在提升精度和稳定性方面的显著优势,并探讨了工程实践中的时间对齐、坐标系统一等关键问题。

weixin_31458015的博客 459

webSocket的介绍

直接导入到sky-server模块即可。

doinmaker的博客 2437

YOLOv13添加WDBB模块,map提升5.34!!,召回率提升6.55,准确率提升3.23

本文提出了一种基于YOLOv13改进的目标检测模型,通过引入WDBB模块显著提升了检测性能。实验结果表明,添加WDBB模块后,mAP提升11.34,召回率提升14.55,准确率提升3.23。文章详细介绍了模型移植方法,包括创建新的yaml配置文件、修改tasks.py和__init__.py文件,以及实现rep_block.py中的核心转换函数。改进后的模型通过深度卷积、通道注意力等模块优化了特征提取能力,同时保持了轻量化的特点。该工作为YOLO系列模型的性能提升提供了新的思路和技术实现。

FJN110的博客 2623

WebSocket的介绍及使用

WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接, 并进行双向数据传输。

zyxzyx666的博客 1845

【推荐100个unity插件】Animator 的替代品?—— Animancer Pro插件的使用介绍

Animancer与Unity Animator对比及使用指南 摘要: 本文对比了Animancer与Unity官方Animator的核心差异,分析了Animancer的优势特点。Animancer采用代码驱动模式,相比Animator的状态机系统更灵活高效,支持实时调试、动态混合和深度逻辑集成。文章详细介绍了Animancer的快速使用方法,包括动画播放、切换和触发机制,并区分了免费版与专业版的功能差异。适合需要高效动画开发、复杂交互逻辑的中小项目,为开发者提供了一种现代化的动画解决方案。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2433

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

websocket 介绍

websocket 和 http 的优势,前端如何实现即时通讯,

qq_40147756的博客 1846

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

websocket介绍

websocket

weixin_41679542的博客 676

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

WebSocket简单介绍

一.WebSocket简单介绍 随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了。近年来,随着HTML5的诞生,WebSocket协议被提出,它实现了浏览器与服务器的全双工通信,扩展了浏览器与服务端的通信功能,使服务端也能主动向客户端发送数据。   我们知道,传统的HTTP协议是无状态的,每次请求(request)都要由客户端(如 浏览器)主动发起,服务端进行处理后返...

sunny潘先生的博客 283

Java WebSocket介绍

前言 日常工作中,大家会接触到websocket和socket,但有时分不清二者的用处和区别,这篇文章介绍websockect的用处和实现。 一、消息推送的选型对比 1.1 轮询 介绍:客户端定时向服务端发送ajax请求,服务器收到请求后立即返回并关闭连接。 优点:后端编写程序较容易。 缺点:TCP的建立和关闭浪费时间和带宽及服务器资源。 1.2 长连接 介绍:发起HTTP 请求,创建一个TCP连接,当前HTTP 的请求发送并接收完,TCP 连接并不关闭,如果还有请求,可以直接在这个TCP连接上继续发送(不

limenglovechen的博客 1974

WebSocket 协议介绍

WebSocket 协议 1、相关技术背景介绍 客户端/浏览器 和 服务端在是怎么进行通信的呢 ?当前许多传统应用的 Web 项目是通过简单的 AJAX 来进行通信的, AJAX 是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。 图 1 AJAX 的 WEB 模型 但随着当前 Web 应用对数据的实时性以及高效性,例如股票的实时行情、火车票的所剩票数、在线聊天的消息展示,随着要求的越

weixin_43501634的博客 4990

WebSocket协议介绍

WebSocket协议介绍

兮动人 1681

websocket详细介绍

HTTP 协议是一种无状态的、无连接的、单向的应用层协议。它采用了请求/响应模型。通信请求只能由客户端发起,服务端对请求做出应答处理,HTTP 协议无法实现服务器主动向客户端发起消息。

fager漫长路 431
上一篇: Kafka与Pulsar差异深入探讨
下一篇: Go语言Gin框架+Gorm实战CRUD
云开发者联盟
博客等级 码龄5年 546粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值