koa socket即时通讯的示例代码


Posted in Javascript onSeptember 07, 2018

前言

http的特点是一问一答,而即时通讯是需要双向通信的,这样以前的即时通信只能使用轮询的方式通过周期性的ajax请求获取数据,直到websocket出现,就完美实现了双向通信

一 即时通讯方式简介

段轮询

前台使用setInterval进行定时请求后台,这样无疑非常浪费性能

长轮询和长连接(html5的EventSource)

客服端连接一次,服务端不断开连接,服务端接收到新消息就发送给前台,客服端和服务端保持一直连接,缺点是只有服务端向客服端输出

websocket

websocket不再是走http协议,而是升级为websocket协议,说到底就是走应用层协议(tcp),实现双向通信,缺点是兼容性问题(ie11)

socket.io

上面的方式都存在一定问题,自然就有人封装一套完美的解决方案,socket.io就是集合了上面几种方案的另一种解决方案

二 即时通信实现

客服端

引入包:<script src="https://cdn.socket.io/socket.io-1.2.1.js";></script>

服务端和客服端通过on和emit进行交互

  1. emit表示发送,事件名自定义,另一端用on进行接收
  2. on表示接受,类似jq绑定事件,事件名对应emit事件名
  3. connect,disconnect是连接和断开事件
// 建立连接
 var socket= io('http://localhost:80')
 // on表示接收
 // emit表示发送
 socket.on('connect', function () {
 console.log('连接上了')
 // 登录,同步前后端信息
 // 请求后端login接口,写入socketid
 socket.emit('login', {
  // 身份标识,可以是时间戳或者唯一id,最要用来回去socketid进行私聊
  id: username
 })
 })


 // 发送消息,这里可以用发送事件进行消息发送
 socket.emit('sendMsg', {
 newAccount: 'xxxxxx'
 })
 
 // 接收消息
 socket.on('msg1', function (data) {
 // 可以对数据进行渲染
 console.log(data)
 
 })
 socket.on('allmessage', function (data) {
 // 接收所有人消息
 console.log(data);

 })
 
 // 表示连接断开了
 socket.on('disconnect', function () {
 console.log('聊天服务器断开了')
 })

服务端(koa+koa-socket)

安装koa-socket

npm i koa2 koa-socket -S
const IO = require('koa-socket')
 const Koa = require('koa2')
 const io = new IO()
 
 const app = new Koa()
 
 // 将socket和app关联
 io.attach(app)
 // 和客服端进行连接
 io.on('connection', (context) => {
 console.log('连接上了')
 })
 // 接收消息
 io.on('sendMsg', function (context) {
 //console.log(context.data)
 // 向客服端实时发送消息
 io.broadcast('msg1', '我是服务器来的')

 // 广播,所有人消息
 io.broadcast('allmessage', context.data.newAccount)
 })

 // 处理登陆同步信息
 io.on('login', context => {
 let id = context.data.id;
 console.log(context);
 });

总结

上面就是koa-socket使用的简单介绍,只实现了简单的消息推送和接收,后面还有私聊和群发,其原理是获取到每个用户的socketid,发送消息时对应发送,后面再进行更新

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
简单三步,搞掂内存泄漏
Mar 10 Javascript
jquery 模式对话框终极版实现代码
Sep 28 Javascript
javascript 得到变量类型的函数
May 19 Javascript
js动态设置鼠标事件示例代码
Oct 30 Javascript
微信小程序 wxapp内容组件 icon详细介绍
Oct 31 Javascript
js格式化时间的简单实例
Nov 27 Javascript
javascript遍历json对象的key和任意js对象属性实例
Mar 09 Javascript
微信小程序实现登录页云层漂浮的动画效果
May 05 Javascript
基于JS实现数字动态变化显示效果附源码
Jul 18 Javascript
Jquery属性的获取/设置及样式添加/删除操作技巧分析
Dec 23 jQuery
纯js实现无缝滚动功能代码实例
Feb 21 Javascript
JavaScript基于用户照片姓名生成海报
May 29 Javascript
vue侧边栏动态生成下级菜单的方法
Sep 07 #Javascript
Vuejs开发环境搭建及热更新【推荐】
Sep 07 #Javascript
小程序点赞收藏功能的实现代码示例
Sep 07 #Javascript
前端防止用户重复提交js实现代码示例
Sep 07 #Javascript
vue实现打印功能的两种方法
Sep 07 #Javascript
使用Angular-CLI构建NPM包的方法
Sep 07 #Javascript
详解如何构建一个Angular6的第三方npm包
Sep 07 #Javascript
You might like
PHP实现图片防盗链破解操作示例【解决图片防盗链问题/反向代理】
2020/05/29 PHP
锋利的jQuery jQuery中的DOM操作
2010/03/21 Javascript
javascript 内存回收机制理解
2011/01/17 Javascript
jquery插件jquery.nicescroll实现图片无滚动条左右拖拽的方法
2015/08/10 Javascript
实现非常简单的js双向数据绑定
2015/11/06 Javascript
学习javascript面向对象 理解javascript原型和原型链
2016/01/04 Javascript
使用three.js 画渐变的直线
2016/06/05 Javascript
HTML5 canvas 9绘制图片实例详解
2016/09/06 Javascript
js无提示关闭浏览器窗口的两种方法分析
2016/11/06 Javascript
微信小程序实现倒计时60s获取验证码
2020/04/17 Javascript
node中koa中间件机制详解
2017/08/22 Javascript
微信小程序WebSocket实现聊天对话功能
2018/07/06 Javascript
详解js常用分割取字符串的方法
2019/05/15 Javascript
在vue中使用Echarts画曲线图的示例
2020/10/03 Javascript
[27:02]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第三场
2014/05/24 DOTA
[46:44]VG vs TNC Supermajor小组赛B组败者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
Python判断两个对象相等的原理
2017/12/12 Python
使用django-crontab实现定时任务的示例
2018/02/26 Python
python实现雨滴下落到地面效果
2018/06/21 Python
Python 使用Numpy对矩阵进行转置的方法
2019/01/28 Python
在Pytorch中使用样本权重(sample_weight)的正确方法
2019/08/17 Python
使用python获取邮箱邮件的设置方法
2019/09/20 Python
python中的函数递归和迭代原理解析
2019/11/14 Python
Python django框架开发发布会签到系统(web开发)
2020/02/12 Python
python3读取autocad图形文件.py实例
2020/06/05 Python
英国领先的葡萄酒专家:Majestic Wine
2017/05/30 全球购物
英国高档百货连锁店:John Lewis
2017/11/20 全球购物
巴西女装购物网站:Eclectic
2018/04/24 全球购物
Notino匈牙利:购买香水和化妆品
2019/04/12 全球购物
兼职学生的自我评价
2013/11/24 职场文书
文化宣传方案
2014/03/13 职场文书
服务承诺书范文
2014/05/19 职场文书
白鹤梁导游词
2015/02/06 职场文书
开学第一天的感想
2015/08/10 职场文书
教师教育心得体会
2016/01/19 职场文书
JavaScript函数柯里化
2021/11/07 Javascript