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 相关文章推荐
jquery中的 $(&quot;#jb51&quot;)与document.getElementById(&quot;jb51&quot;) 的区别
Jul 26 Javascript
ExtJS[Desktop]实现图标换行示例代码
Nov 17 Javascript
jQuery中:text选择器用法实例
Jan 03 Javascript
第一次接触神奇的Bootstrap导航条
Aug 09 Javascript
JS实现图片延迟加载并淡入淡出效果的简单方法
Aug 25 Javascript
JS实现移动端实时监听输入框变化的实例代码
Apr 12 Javascript
jQuery 实现双击编辑表格功能
Jun 19 jQuery
JavaScript中Hoisting详解 (变量提升与函数声明提升)
Aug 18 Javascript
layer弹出层 iframe层去掉滚动条的实例代码
Aug 17 Javascript
灵活使用console让js调试更简单的方法步骤
Apr 23 Javascript
H5+css3+js搭建带验证码的登录页面
Oct 11 Javascript
如何在Vue项目中添加接口监听遮罩
Jan 25 Vue.js
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
海河写的 Discuz论坛帖子调用js的php代码
2007/08/23 PHP
PHP用GD库生成高质量的缩略图片
2011/03/09 PHP
PHP访问数据库集群的方法小结
2016/03/14 PHP
对laravel in 查询的使用方法详解
2019/10/09 PHP
JavaScript 学习笔记(十一)
2010/01/19 Javascript
JQuery的read函数与js的onload不同方式实现
2013/03/18 Javascript
详解iframe与frame的区别
2016/01/13 Javascript
老生常谈的跨域处理
2017/01/11 Javascript
bootstrap+jQuery 实现下拉菜单中复选框全选和全不选效果
2017/06/12 jQuery
js获取地址栏参数的两种方法
2017/06/27 Javascript
angularjs路由传值$routeParams详解
2020/09/05 Javascript
vue element-ui 绑定@keyup事件无效的解决方法
2018/03/09 Javascript
JavaScript常见JSON操作实例分析
2018/08/08 Javascript
JS实现的图片选择顺序切换和循环切换功能示例【测试可用】
2018/12/28 Javascript
Vue实现购物车详情页面的方法
2019/08/20 Javascript
js计时事件实现圆形时钟
2020/03/25 Javascript
[01:12:40]DOTA2-DPC中国联赛 正赛 DLG vs XG BO3 第三场 1月25日
2021/03/11 DOTA
matplotlib 输出保存指定尺寸的图片方法
2018/05/24 Python
python实现人人自动回复、抢沙发功能
2018/06/08 Python
python使用numpy读取、保存txt数据的实例
2018/10/14 Python
Python 网络编程之UDP发送接收数据功能示例【基于socket套接字】
2019/10/11 Python
python3 logging日志封装实例
2020/04/08 Python
使用django自带的user做外键的方法
2020/11/30 Python
HTML5 自动聚焦(autofocus)属性使用介绍
2013/08/07 HTML / CSS
美国气象仪器、花园装饰和墙壁艺术商店:Wind & Weather
2019/05/29 全球购物
大学生个人推荐信范文
2013/11/25 职场文书
数控专业推荐信范文
2013/12/02 职场文书
《北大荒的秋天》教学反思
2014/04/14 职场文书
保护环境标语
2014/06/09 职场文书
企业文化宣传标语
2014/06/09 职场文书
节约每一滴水演讲稿
2014/09/09 职场文书
导师工作推荐信
2015/03/27 职场文书
中职班主任培训心得体会
2016/01/07 职场文书
导游词之云南省玉龙雪山
2019/12/19 职场文书
Spring整合Mybatis的全过程
2021/06/28 Java/Android
MySQL的存储函数与存储过程的区别解析
2022/04/08 MySQL