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类中定义原型方法的两种实现的区别
Mar 08 Javascript
JS input 数字验证代码
Jul 30 Javascript
浅谈Javascript面向对象编程
Nov 15 Javascript
用js控制组织结构图可以任意拖拽到指定位置
Jan 17 Javascript
jQuery源码分析之Callbacks详解
Mar 13 Javascript
JavaScript实现倒计时代码段Item1(非常实用)
Nov 03 Javascript
详解JavaScript for循环中发送AJAX请求问题
Jun 23 Javascript
jQuery实现背景滑动菜单
Dec 02 Javascript
解析如何利用iframe标签以及js制作时钟
Dec 08 Javascript
vue-router路由简单案例介绍
Feb 21 Javascript
JS实现留言板功能
Jun 17 Javascript
详谈JS中数组的迭代方法和归并方法
Aug 11 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 一元分词算法
2009/11/30 PHP
php利用嵌套数组拼接与解析json的方法
2017/02/07 PHP
thinkPHP5.0框架环境变量配置方法
2017/03/17 PHP
[原创]PHP获取数组表示的路径方法分析【数组转字符串】
2017/09/01 PHP
PHP文件管理之实现网盘及压缩包的功能操作
2017/09/20 PHP
关于文本框的一些限制控制总结~~
2010/04/15 Javascript
js操作二级联动实现代码
2010/07/27 Javascript
jquery对元素拖动排序示例
2014/01/16 Javascript
鼠标移到图片上变大显示而不是放大镜效果
2014/06/15 Javascript
JavaScript判断浏览器类型的方法
2015/02/10 Javascript
jQuery插件制作之全局函数用法实例
2015/06/01 Javascript
jQuery Validate初步体验(二)
2015/12/12 Javascript
一道面试题引发的对javascript类型转换的思考
2017/03/06 Javascript
jQuery实现腾讯信用界面(自制刻度尺)样式
2017/08/15 jQuery
浅谈vuex之mutation和action的基本使用
2017/08/29 Javascript
JavaScript基于数组实现的栈与队列操作示例
2018/12/22 Javascript
详解VUE前端按钮权限控制
2019/04/26 Javascript
使用异步controller与jQuery实现卷帘式分页
2019/06/18 jQuery
Nuxt v-bind绑定img src不显示的解决
2019/12/05 Javascript
vue组件库的在线主题编辑器的实现思路
2020/04/03 Javascript
Javascript中window.name属性详解
2020/11/19 Javascript
[02:35]DOTA2超级联赛专访XB 难忘一年九冠称王
2013/06/20 DOTA
[14:21]VICI vs EG (BO3)
2018/06/07 DOTA
Python实现提取文章摘要的方法
2015/04/21 Python
在python中实现将一张图片剪切成四份的方法
2018/12/05 Python
只需7行Python代码玩转微信自动聊天
2019/01/27 Python
学生信息管理系统Python面向对象版
2019/01/30 Python
带你彻底搞懂python操作mysql数据库(cursor游标讲解)
2020/01/06 Python
python pycharm最新版本激活码(永久有效)附python安装教程
2020/09/18 Python
python环境搭建和pycharm的安装配置及汉化详细教程(零基础小白版)
2020/08/19 Python
html5实现多图片预览上传及点击可拖拽控件
2018/03/15 HTML / CSS
Charles&Keith美国官方网站:新加坡快时尚鞋类和配饰零售商
2019/11/27 全球购物
SEPHORA丝芙兰德国官方购物网站:化妆品、护肤品和香水
2020/01/21 全球购物
举例说明类变量和实例变量的区别
2016/06/30 面试题
我们的节日清明节活动总结
2014/04/30 职场文书
Python合并pdf文件的工具
2021/07/01 Python