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 相关文章推荐
传智播客学习之java 反射
Nov 22 Javascript
js切换div css注意的细节
Dec 10 Javascript
node.js中的fs.symlink方法使用说明
Dec 15 Javascript
IE8中动态创建script标签onload无效的解决方法
Dec 22 Javascript
JavaScript DOM基础
Apr 13 Javascript
AngularJS 与百度地图的结合实例
Oct 20 Javascript
基于JavaScript实现Tab选项卡切换效果
Nov 24 Javascript
vue this.reload 方法 配置
Sep 12 Javascript
如何使用 vue + d3 画一棵树
Dec 03 Javascript
浅谈目前可以使用ES10的5个新特性
Jun 25 Javascript
VUE使用 wx-open-launch-app 组件开发微信打开APP功能
Aug 11 Javascript
vue3.0 的 Composition API 的使用示例
Oct 26 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
造就帕卡马拉的帕卡斯是怎么被发现的
2021/03/03 咖啡文化
php 生成饼图 三维饼图
2009/09/28 PHP
CodeIgniter图像处理类的深入解析
2013/06/17 PHP
php中current、next与reset函数用法实例
2014/11/17 PHP
PHP输出缓冲控制Output Control系列函数详解
2015/07/02 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
2017/11/14 PHP
JavaScript下利用fso判断文件是否存在的代码
2010/12/11 Javascript
将Datatable转化成json发送前台实现思路
2013/09/06 Javascript
AngularJS基础知识
2014/12/21 Javascript
JavaScript的内存释放问题详解
2015/01/21 Javascript
jQuery实现横向带缓冲的水平运动效果(附demo源码下载)
2016/01/29 Javascript
JavaScript String 对象常用方法详解
2016/05/13 Javascript
微信小程序  生命周期详解
2016/10/27 Javascript
jquery根据name取得select选中的值实例(超简单)
2018/01/25 jQuery
图文介绍Vue父组件向子组件传值
2018/02/17 Javascript
vue动态配置模板 'component is'代码
2019/07/04 Javascript
js实现查询商品案例
2020/07/22 Javascript
js实现鼠标滑动到某个div禁止滚动
2020/09/17 Javascript
[48:27]EG vs Liquid 2018国际邀请赛淘汰赛BO3 第二场 8.25
2018/08/29 DOTA
Python 字符串与数字输出方法
2018/07/16 Python
python dict 相同key 合并value的实例
2019/01/21 Python
Python urlencode和unquote函数使用实例解析
2020/03/31 Python
python判断变量是否为列表的方法
2020/09/17 Python
python中@contextmanager实例用法
2021/02/07 Python
深入理解HTML5定时器requestAnimationFrame的使用
2018/12/12 HTML / CSS
lululemon美国官网:瑜伽服+跑步装备
2018/11/16 全球购物
提高EJB性能都有哪些技巧
2012/03/25 面试题
党的群众路线教育实践活动批评与自我批评
2014/02/16 职场文书
感恩寄语大全
2014/04/11 职场文书
餐厅服务员岗位职责
2015/02/09 职场文书
奖励申请报告范文
2015/05/15 职场文书
2016年教师新年寄语
2015/08/18 职场文书
2016年社区服务活动总结
2016/04/06 职场文书
Java 中的 Unsafe 魔法类的作用大全
2021/06/26 Java/Android
MySQL 开窗函数
2022/02/15 MySQL
MySQL的表级锁,行级锁,排它锁和共享锁
2022/07/15 MySQL