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 相关文章推荐
一个对于js this关键字的问题
Jan 09 Javascript
jQuery powerFloat万能浮动层下拉层插件使用介绍
Dec 27 Javascript
javascript:history.go()和History.back()的区别及应用
Nov 25 Javascript
jQuery插件开发详细教程
Jun 06 Javascript
jQuery使用drag效果实现自由拖拽div
Jun 11 Javascript
浅谈关于JavaScript API设计的一些建议和准则
Jun 24 Javascript
JS实现自动切换文字的导航效果代码
Aug 27 Javascript
基于jQuery下拉选择框插件支持单选多选功能代码
Jun 07 Javascript
JS获取和修改元素样式的实例代码
Aug 06 Javascript
Vue2.0父组件与子组件之间的事件发射与接收实例代码
Sep 19 Javascript
js中怎么判断两个字符串相等的实例
Jan 17 Javascript
jquery实现图片放大镜效果
Dec 23 jQuery
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的5个安全措施小结
2012/07/17 PHP
由prototype_1.3.1进入javascript殿堂-类的初探
2006/11/06 Javascript
jquery 插件 任意位置浮动固定层
2008/12/25 Javascript
用cssText批量修改样式
2009/08/29 Javascript
prototype 中文参数乱码解决方案
2009/11/09 Javascript
使用SyntaxHighlighter实现HTML高亮显示代码的方法
2010/02/04 Javascript
ExtJS 下拉多选框lovcombo
2010/05/19 Javascript
JavaScript闭包函数访问外部变量的方法
2014/08/27 Javascript
判断浏览器的内核及版本号方法汇总
2015/01/05 Javascript
JS判断图片是否加载完成方法汇总(最新版)
2016/05/13 Javascript
实例解析jQuery中proxy()函数的用法
2016/05/24 Javascript
js判断主流浏览器类型和版本号的简单实现代码
2016/05/26 Javascript
JS比较两个数值的大小实例
2016/11/25 Javascript
VueJS事件处理器v-on的使用方法
2017/09/27 Javascript
微信小程序实现动态设置placeholder提示文字及按钮选中/取消状态的方法
2017/12/14 Javascript
JS实现为动态添加的元素增加事件功能示例【基于事件委托】
2018/03/21 Javascript
微信小程序实现简易table表格
2020/06/19 Javascript
微信小程序自定义头部导航栏(组件化)
2019/11/15 Javascript
vue项目在webpack2实现移动端字体自适配功能
2020/06/02 Javascript
[01:45]亚洲邀请赛互动指南虚拟物品介绍
2015/01/30 DOTA
[01:02]DOTA2辉夜杯决赛日 CDEC.Y对阵VG赛前花絮
2015/12/27 DOTA
Python内置函数的用法实例教程
2014/09/08 Python
尝试用最短的Python代码来实现服务器和代理服务器
2016/06/23 Python
Python 异常处理的实例详解
2017/09/11 Python
tensorflow实现softma识别MNIST
2018/03/12 Python
神经网络(BP)算法Python实现及应用
2018/04/16 Python
实例讲解CSS3中Transform的perspective属性的用法
2016/04/22 HTML / CSS
Merrell美国官网:美国登山运动鞋品牌
2018/02/07 全球购物
世界上最受欢迎的花店:1-800-Flowers.com
2020/06/01 全球购物
介绍JAVA 中的Collection FrameWork(及如何写自己的数据结构)
2014/10/31 面试题
成人大专生实习期的自我评价
2013/10/02 职场文书
复核员上岗演讲稿
2014/01/05 职场文书
教师个人教学总结
2015/02/11 职场文书
CSS3 制作的彩虹按钮样式
2021/04/11 HTML / CSS
企业版Windows 11有哪些新功能? Win11适用于企业的功能介绍
2021/11/21 数码科技
【海涛教你打DOTA】黑鸟第一视角解说
2022/04/01 DOTA