3分钟接入socket.io使用
WebSocket 简介
传统的客户端和服务器通信协议是HTTP:客户端发起请求,服务端进行响应,服务端从不主动勾搭客户端。
这种模式有个明显软肋,就是同步状态。而实际应用中有大量需要客户端和服务器实时同步状态的场景,比如聊天室、股票行情、在线共享文档等都需要客户端实时拿到服务器的最新状态。
针对这种实时同步的需求,一种简单的方式是轮询,比如每隔5s发一次http请求去拿服务器最新的状态数据。但这种方式会存在数据延迟,浪费带宽等副作用。
更完美的方式是使用WebSocket,浏览器原生支持,W3C标准协议,客户端和服务器建立持久性连接可以互发消息。
socket.io 简介
socket.io 是一个类库,内部封装了WebSocket,可以在浏览器与服务器之间建立实时通信。
如果某些旧版本的浏览器不支持WebSocket,socket.io会使用轮询代替。另外它还具有可发送二进制消息、多路复用、创建房间等特性,因此相比直接使用原生WebSocket,socket.io是更好的选择。
开发一个实时应用主要分两部分:服务端和客户端,socket.io分别提供了相应的npm包供我们方便地调用。
接下来就通过一个生动形象且有趣的栗子分别介绍这两大块。
现在假设李白,瑶,吕布,后羿,貂蝉5个人加入了一个叫 KPL 的房间,在文章结束时我们将拥有一个麻雀虽小五脏俱全的峡谷英雄在线聊天室
服务端api
首先安装socket.io提供的服务端npm包:
npm i socket.io
可以与 Express 框架配合使用:
const http = require('http')
const app = require('express')()
const server = http.createServer(app)
const io = require('socket.io')(server)
server.listen(3000)
也可以与 Koa 框架配合使用
const http = require('http')
const Koa = require('koa')
const app = new Koa()
const server = http.createServer(app.callback())
const io = require('socket.io')(server)
server.listen(3000)
使用起来就是这么简单。接下来就可以写业务逻辑啦
io.on('connect', client => { // client 即是连接上来的一个客户端
console.log(client.id) // id 是区分客户端的唯一标识
client.on('disconnect', () => {}) // 客户端断开连接时调用(可能是关掉页面,网络不通了等)
})
connect 和 disconnect 是 socket.io 内置的事件类型,用于在客户端连接和断开的时候做一些事情。
在客户端建立连接时需要把他们加入到一个房间里去,类似创建了一个聊天室
console.log(client.id)
+ client.join('KPL') // 将客户端加入到 KPL 房间内
client.on('disconnect', () => {})
紧接着瑶进来秒发了首条消息:我打野,不给就送
服务器在收到这条振奋人心的消息后需要立即同步给其他四位队友
client.join('KPL')
+ client.on('talk', message => {
+ client.to('KPL').emit('talk', message) // 发送给房间里的每个人,除了发送者
+ })
client.on('disconnect', () => {})
服务端的功能到这基本上就开发完了。创建了一个房间,并在收到成员消息时立即同步给房间里的其他成员
客户端api
socket.io 为客户端提供了另一个npm包,直接安装
npm i socket.io-client
接下来就可以在页面上建立到服务器的连接啦
import io from 'socket.io-client'
const socket = io() // 建立连接
向服务器发送消息
const socket = io()
+ socket.emit('talk', '我打野,不给就送')
接收服务器发来的消息
const socket = io()
+ socket.on('talk', message => {
+ })
李白看到了瑶的消息,强忍住问候对方家人的冲动,像哄那啥似地说道:
socket.on('talk', message => {
+ socket.emit('talk', '你买个石头骑在我头上他不香么')
})
客户端的功能到这基本上也开发完了。核心api就是on和emit用于收发消息,既简单又优雅。
最后
至此一个可以实时发送接收消息的聊天室就完成了,虽然简陋,但核心功能完备。
瑶最终倔强地打了野,李白选择了上路,3分钟被对面捶到高地,后羿在家里等鸟,吕布和貂蝉躲在蓝buff旁边的草丛里聊天,就这样在李白和瑶互相拉票举报对方的全局消息中游戏结束
3分钟接入socket.io使用的更多相关文章
- Socket.io和Redis写Realtime App 之express初试
第一步:用npm下载express前端框架 注意事项:首先要确保已经安装了node.js和 npm 然后在项目中创建一个package.json文件,不能完全为空不写,至少要有两个大括号,不然怎么证明 ...
- 解决Socket.IO在IE8下触发disconnect时间过长
本文地址: http://www.cnblogs.com/blackmanba/p/solve-socketIO-IE8-emit-disconnect-too-long.html或者http://f ...
- 很幽默的讲解六种Socket IO模型
很幽默的讲解六种Socket IO模型 本文简单介绍了当前Windows支持的各种Socket I/O模型,如果你发现其中存在什么错误请务必赐教. 一:select模型二:WSAAsyncSelect ...
- 很幽默的讲解六种Socket IO模型 Delphi版本(自己Select查看,WM_SOCKET消息通知,WSAEventSelect自动收取,Overlapped I/O 事件通知模型,Overlapped I/O 完成例程模型,IOCP模型机器人)
很幽默的讲解六种Socket IO模型(转)本文简单介绍了当前Windows支持的各种Socket I/O模型,如果你发现其中存在什么错误请务必赐教. 一:select模型 二:WSAAsyncSel ...
- 使用Socket.IO做单页SPA应用更新
单页应用的挑战之一是确保客户端软件和服务器应用相匹配. 举例:如果一个用Bobbie在他的浏览器中加载我们的单页应用,五分钟之后我们更新了服务器应用.现在Bobbiede遇到了问题,因为我们对服务器做 ...
- 在web浏览器上显示室内温度(nodeJs+arduino+socket.io)
上次的nodejs操作arduino入门篇中实现了如何连接arduino.这次我们来实现通过arduino测量室内温度并在浏览器上显示出来. [所需材料] 硬件:LM35温度传感器,arduino u ...
- Node学习笔记(三):基于socket.io web版你画我猜(二)
上一篇基础实现的功能是客户端canvas作图,导出dataURL从而实现图片信息推送,下面具体讲下服务端的配置及客户端的配置同步 首先先画一个流程图,讲下大概思路 <canvas id=&quo ...
- node.js+socket.io配置详解
由于我是在win7的环境下,在这里就以win7系统为例进行讲解了. 首先需要在nodejs官网下载最新版的node.js,下载完毕直接安装即可,安装成功后在cmd命令行中执行node指令,如下结果就说 ...
- 使用Node.js+Socket.IO搭建WebSocket实时应用
Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新.它有着广泛的应用场景,比如在线聊天室.在线客服系统.评论系统.WebIM等. W ...
随机推荐
- Keras cnn 手写数字识别示例
#基于mnist数据集的手写数字识别 #构造了cnn网络拟合识别函数,前两层为卷积层,第三层为池化层,第四层为Flatten层,最后两层为全连接层 #基于Keras 2.1.1 Tensorflow ...
- 激励函数 (Activation)
softplus是有关概率的巴拉巴拉? Torch 中的激励函数有很多, 不过我们平时要用到的就这几个. relu, sigmoid, tanh, softplus. 那我们就看看他们各自长什么样啦. ...
- C++学习——输入输出及头文件
C++学习 ——输入输出及头文件 一.输入输出 (1)cin与cout C++中也可以用printf与scanf,但是相对于这个,cin与cout更加方便一点.让我们先来看一段代码. 运行结果: 这里 ...
- kotlin + springboot 整合redis,Redis工具类编写及单元测试
参考自: https://www.cnblogs.com/zeng1994/p/03303c805731afc9aa9c60dbbd32a323.html 1.maven依赖 <?xml ve ...
- Ssh_key免秘钥登录
一,环境准备 1.1 操作系统 [root@manager ~]# cat /etc/redhat-release CentOS release 6.7 (Final) [root@manager ~ ...
- $Noip2014/Luogu2296$ 寻找道路 图论
$Luogu$ $Sol$ 首先找出符合条件一的点然后跑$SPFA$就好了叭. 如何判断点是否符合条件一呢?先连反边,记录每个点的入度,然后从终点开始$dfs$,记录每个点被到达的次数,若到达的次数等 ...
- Markdown数学符号
上标 语法: x^2 效果: \(x^2\) 下标 语法: x_i 效果: \(x_i\) 整体 语法: x^{2y} 效果: \(x^{2y}\) 大括号 语法: \{\} 效果: \(\{\}\) ...
- nodeJS实现识别验证码(tesseract-ocr+GraphicsMagick)
背景 最近在写一个爬虫的小工具,卡在登录这里. 想爬的网站需要登录才能获取数据,登录又需要输入验证码. 好在验证码是简单的验证码,还可以自己识别试试. 需求分析 1.保存验证码图片 2.识别验证码 3 ...
- ArcEngine 里面的日期
问题: 将自己做的GIS系统放到其他系统上的时候发现用 IQueryFilter 进行时间查询的时候报错,原来的系统没有这个问题. 原因: 后来调试代码发现查询的时间里面有中文,显示格式 " ...
- 从头学pytorch(十七):网络中的网络NIN
网络中的网络NIN 之前介绍的LeNet,AlexNet,VGG设计思路上的共同之处,是加宽(增加卷积层的输出的channel数量)和加深(增加卷积层的数量),再接全连接层做分类. NIN提出了一个不 ...