前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >WebSocket系列之socket.io

WebSocket系列之socket.io

原创
作者头像
肖乐
发布于 2018-01-15 08:59:07
发布于 2018-01-15 08:59:07
6.7K1
举报
文章被收录于专栏:肖乐的专栏肖乐的专栏

导语:上篇讲了WebSocket基础知识和浏览器端的实现,WebSocket server和http server也是有区别的,这篇开始讲nodejs平台的一个很成熟,知名度也最大的WebSocket实现--socket.io

socket.io:

1.跨浏览器、跨平台,多种连接方式自动切换

2.功能完善,心跳检测,断线自动重连

3.server和client必须配套使用,不能直接用原生WebSocket

socket.io server:

socket.io client:

参数说明:

1.client必须引用socket.io的client js文件,没法用原生WebSocket

2.server端的path和client端的path必须对应上,并且server端设置的path也是client引用的js的path

3.server端的serveClient控制socket.io client js是否可以被引用,默认true,如果设为false,那么client里会加载不到socket.io client js文件

4.client端的transports设置的是websocket连接的建立方式,默认值是'polling', 'websocket',可以设置成'websocket',区别是使用默认的会先用http拉取session id,再升级到WebSocket,如果设置成'websocket'会跳过http请求,直接用WebSocket建立连接,如下图:

'polling', 'websocket':

'websocket':

断线重连:

socket.io已经帮我们实现了断线重连,当server close的时候,client会马上探测到并开始尝试重连,如下图

多进程和分布式部署:

看了上面的说明,是不是觉得socket.io真简单,分分钟掌握,开始撸代码,却不知等到你的产品用户量上来的那一天,并发上不去了,你开始得心应手的用cluster开启多进程,还不够,再分部署部署,实现代码如下:

特别说明:你在windows版nodejs测试上面代码时,你会发现每次请求都到同一个worker,看着socket.io多进程正常运行,不过布到linux里就会出现请求400,那是因为windows版nodejs的负载均衡算法和linux不一样(负载均衡算法),linux用的Round-Robin(轮询调度),window版因为Round-Robin有性能问题,暂时用的操作系统的算法,不过文档说等到性能问题解决了,会切到Round-Robin,我们也可以如上面代码第三行,通过设置cluster.schedulingPolicy = 2;为windows开启Round-Robin,一旦开启,就会出现请求400,如下图:

出现400原因是:拉取session id的进程和用该session id建立连接的进程不是同一个,甚至不是同一台服务器,进程A给你分配的session id,进程B当然不认识,也就不会给你建立socket连接了,我们需要保证一个用户的多次连接由同一个进程处理,不仅是session id,也是因为不支持WebSocket的浏览器,socket.io会降级使用轮询实现socket,而这种socket是由多次请求组成的,如果两次请求不是同一个进程处理,运行时都不一致,会出现各种问题

解决方案:上面已经说了,就是保证一个用户的多次连接由同一个进程处理,具体怎么做了,就是nginx代理,原理是nginx支持根据client ip分发请求到对应进程

nginx可以把请求直接分发到nodejs的worker进程,这种就需要同一台机器的各worker进程监听私有端口,并且在nginx配置那里配置对应port,或者由master进程监听一个端口,nginx分发请求到master,再由master分配到worker,这就是socket.io里的sticky session,下面说明

sticky session(实现代码如下图):

说明:

1.根据cpu数开启多进程

2.master监听一个port,启动net server,参数pauseOnConnect:true必须有,因为master接收connect,是为了再分发到worker,master不需要读取数据,数据读取应该由worker来完成

3.根据remoteAddress决定分发给哪个worker,这样就能保证同一个remoteAddress必然由同一个worker处理

至此sticky session实现完成,完美根据client ip分发请求,再也不会请求400了

demo代码都放在附件了,各位可以本地运行试下,当然本地需要安装nodejs和socket.io了

附件:

archive.zip

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
1 条评论
热度
最新
archive文件放错了,感觉是做数据分类用的文件。
archive文件放错了,感觉是做数据分类用的文件。
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
socket.io实践干货
一、前言 socket.io 实现了实时双向的基于事件的通讯机制,是基于 webSocket 的封装,但它不仅仅包括 webSocket,还对轮询(Polling)机制以及其它的实时通信方式封装成了通用的接口,并且在服务端实现了这些实时机制的相应代码 socket.io 是跨平台的,可以实现多平台的即时通讯 由于 iOS 端进行 socket 编程主要使用 GCDAsyncSocket 框架,但要实现 Android、iOS、web 多平台的通讯,还是选择统一的框架或协议比较好。 基本 api,使用 soc
sunsky
2020/08/20
1.4K0
socket.io实践干货
基于Socket.IO的Client封装
有了WebSocket的经验,这次写Socket.IO的Client顺利了很多,参考之前的文章:socket接口开发和测试初探、IntelliJ中基于文本的HTTP客户端、基于WebSocket的client封装。之前的代码有更新,主要修复了一些BUG以及增加了一些功能方便在实际功能测试中使用,关于性能测试的,接下来还会在继续优化和多线程Socket接口的测试实践。
FunTester
2020/12/09
1.2K0
《 Socket.IO》 解决 WebSocket 通信!
大家好呀,我是小菜~ 本文主要介绍 Socket.IO 微信公众号已开启,小菜良记,没关注的同学们记得关注哦! 在介绍 Socket.IO 之前, 我们先考虑一个问题, 如果这个时候有个需求, 类似
蔡不菜丶
2022/09/21
2.5K0
《 Socket.IO》 解决 WebSocket 通信!
Nodejs+socket.io搭建WebRTC信令服务器
我们在学习 WebRTC 时,首先要把实验环境搭建好,这样我们就可以在上面做各种实验了。
音视频_李超
2020/04/01
8.4K2
Nodejs+socket.io搭建WebRTC信令服务器
kubernetes 下实现socket.io 的集群模式
socket.io 单节点模式是很容易部署的,但是往往在生产环境一个节点不能满足业务需求,况且还要保证节点挂掉的情况仍能正常提供服务,所以多节点模式就成为了生成环境的一种必须的部署模式。
domain0
2019/05/15
2.5K0
kubernetes 下实现socket.io 的集群模式
Thinkphp 6.0 swoole扩展websocket使用教程
ThinkPHP即将迎来最新版本6.0,针对目前越来越流行Swoole,thinkphp也推出了最新的扩展think-swoole 3.0。
程序猿的栖息地
2022/04/29
3.2K0
Thinkphp 6.0 swoole扩展websocket使用教程
WebSocket协议 与 IO多路复用
最近在把 Facebook Message 接入客服系统,由于与 Facebook Message 对接的收发消息都是通过调用 http 接口来实现的,如果想实现即时通讯,还需要在中间加一个 WebSocket 来转发消息。如下图:
nnngu
2021/01/05
2.7K0
WebSocket协议 与 IO多路复用
低延迟双向实时事件通信 Socket.IO
Socket.IO 是一个库,可以在客户端和服务器之间实现低延迟,双向和基于事件的通信。
Tinywan
2024/08/27
4170
低延迟双向实时事件通信 Socket.IO
PHP系列 | PHP跨平台实时通讯框架 Socket.IO 的应用
利用PHP构建能够在不同浏览器和移动设备上良好运行的实时应用,如实时分析系统、在线聊天室、在线客服系统、评论系统、WebIM等。
Tinywan
2019/07/23
3.8K0
Nodejs 进阶:解答 Cluster 模块的几个疑问
?在 PM2 的配置文件中可以设置 exec_model:'cluster' 和 instances 两个属性来设置开启多个进程,PM2 其实主要也是利用 Nodejs Cluster 这个模块来实现了,还有 Egg.js 中的 egg-cluster 模块在启动 Worker 进程时也是使用的 Nodejs Cluster 模块。下面来了解下 Nodejs Cluster 这个模块做了什么?
五月君
2020/03/18
2.1K0
Nodejs 进阶:解答 Cluster 模块的几个疑问
实战 | 基于node+socket.io+redis的多房间多进程聊天室
作者 | jaychen 原文 | http://imweb.io/topic/584412459be501ba17b10a7b 一、相关技术介绍: 消息实时推送,指的是将消息实时地推送到浏览器,用户不需要刷新浏览器就可以实时获取最新的消息,实时聊天室的技术原理也是如此。传统的Web站点为了实现推送技术,所用的技术都是轮询,这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求。 短轮询(Polling) 客户端需要定时往浏览器轮询发送请求,且只有当服务有数据更新后,客户端的下一次轮询
用户1097444
2022/06/29
2.2K0
实战 | 基于node+socket.io+redis的多房间多进程聊天室
socket.io的websocket示例
写了一个简单的demo,直接上代码吧。用的时候注意一下版本号,可能 socket.io 的 API 有修改~
meteoric
2018/12/28
1.2K0
看我如何分析并渗透WebSocket和Socket.io
WebSocket是一种允许浏览器和服务器建立单个TCP连接然后进行全双工异步通信的技术。由于它允许实时更新,而浏览器也无需向后台发送数百个新的HTTP polling请求,所以对于web程序来说,WebSocket非常流行。这对于测试者来说是不好的,因为对WebSocket工具的支持不像HTTP那样普遍,有时候会更加复杂。
FB客服
2018/12/24
2.6K0
使用node、Socket.io 搭建简易聊天室
Socket.io是一个WebSocket库,会自动根据浏览器从WebSocket、AJAX长轮询、Iframe流等等各种方式中选择最佳的方式来实现网络实时应用,而且支持的浏览器最低达IE5.5。 Socket.io 服务器 和 Socket.io 客户端之间全双工通信信道 尽可能使用WebSocket 连接建立(”尽可能“就说明要求客户端和服务端都必须使用,HTTP 长轮询`作为后备。 在了解socket-io前,我们先了解三种通信方式和Http轮询。
can4hou6joeng4
2023/11/29
4930
socket.io
本译文来源于https://socket.io/get-started/chat/,不足之处请多批评指正。 最近在学些vuejs和websocket相关技术,使用了websocket的两个封装的库vue-socket.io和vue-websocket
ccf19881030
2020/04/10
4.1K0
socket.io
socket.io的简单使用
在开发websocket的时候,我们可能会用到socket.io这个库,来看一下这个库的简答应用,先看一个简单的案例,服务端代码:
挥刀北上
2021/02/03
2.1K0
socket.io搭配pm2(cluster)集群解决方案
socket.io与cluster 在线上系统中,需要使用node的多进程模型,我们可以自己实现简易的基于cluster模式的socket分发模型,也可以使用比较稳定的pm2这样进程管理工具。在常规的http服务中,这套模式一切正常,可是一旦server中集成了socket.io服务就会导致ws通道建立失败,即使通过backup的polling方式仍会出现时断时连的现象,因此我们需要解决这种问题,让socket.io充分利用多核。 在这里之所以提到socket.io而未说websocket服务,是因为so
欲休
2018/03/15
6K1
socket.io搭配pm2(cluster)集群解决方案
搞懂现代Web端即时通讯技术一文就够:WebSocket、socket.io、SSE
有关Web端即时通讯技术的文章我已整理过很多篇,阅读过的读者可能都很熟悉,早期的Web端即时通讯方案,受限于Web客户端的技术限制,想实现真正的“即时”通信,难度相当大。
JackJiang
2021/09/07
3.3K0
搞懂现代Web端即时通讯技术一文就够:WebSocket、socket.io、SSE
通过Node.js的Cluster模块源码,深入PM2原理
众所周知,Node.js中的JavaScript代码执行在单线程中,非常脆弱,一旦出现了未捕获的异常,那么整个应用就会崩溃。
Peter谭金杰
2020/05/09
3.1K1
通过Node.js的Cluster模块源码,深入PM2原理
Socket Server的N种并发模型汇总
本文主要介绍常见的Server的并发模型,这些模型与编程语言本身无关,有的编程语言可能在语法上直接透明了模型本质,所以开发者没必要一定要基于模型去编写,只是需要知道和了解并发模型的构成和特点即可。
brookwang
2022/06/24
5390
Socket Server的N种并发模型汇总
相关推荐
socket.io实践干货
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档