Egg - socket.io

起步

我们都知道,ajax是客户端请求服务端(单向),服务端不能够主动给我发送消息

有时候我们在web开发的时候,需要服务端主动向客服端发送消息,这个时候我们就需要用到双工通讯 - socket,当然非常老旧的项目也可以通过ajax轮询解决实时通讯的问题


服务端 - 开始

npm i --save egg-socket.io

config/plugin.js

exports.io = {
  enable: true,
  package: "egg-socket.io",
};

config/config.default.js

exports.io = {
  namespace: {
    "/": {
      connectionMiddleware: ["connection"],
      packetMiddleware: ["receive"],
    },
  },
};

app下创建socket目录app/.io

  app/io

         controller 

             visited.js

         middleware    

             connection.js  创建链接中间件

             receive.js socket服务端收到客服端参数走得中间件

app/io/controller/visited.js

const { Controller } = require("egg");

class VisitedController extends Controller {
  async server() {
    const { ctx, app } = this;
    const visitedCount = await ctx.service.app.get();
    const visited = Number(visitedCount[0].visited) + 1;
    const result = await ctx.service.app.set(visited);
    // 默认调用一次controller,将访问量传递给前端
    // 前端页面访问时,调用visitedServer继续调用本控制器,更新visited访问量
    await ctx.socket.server.emit("CustomVisited", visited);
  }
}

module.exports = VisitedController;

app/io/middelware/connection.js


module.exports = (app) => {
  return async (ctx, next) => {
    // 通知全体
    ctx.socket.emit("res", "connected!");
    await next();
    // execute when disconnect.
    console.log("disconnection!");
  };
};

  app/io/middelware/receive.js


module.exports = (app) => {
  // socket接收到参数的预处理
  return async (ctx, next) => {
    // console.log(ctx.packet);
    await next();
    // execute when disconnect.
    console.log("socket 收到了些参数都会走这里!");
  };
};

 app/router.js

"use strict";

/**
 * @param {Egg.Application} app - egg application
 */
module.exports = (app) => {
  const { router, controller, io } = app;
  
  // io.of('/') socket链接的命名空间
  // route('server') socket 客户端发送server事件时
  io.of("/").route("visitedServer", io.controller.visited.server);
};

客户端-开始

npm i --save vue-socket.io

main.js

<template>
  <div>this is carouselLists 访问量{{ visited }}</div>
</template>

<script>
import Vue from "vue";
import VueSocketio from "vue-socket.io";

Vue.use(
  new VueSocketio({
    debug: true,
    connection: "http://127.0.0.1:7001/",
  })
);

export default {
  name: "CarouselList",
  data() {
    return {
      visited: null,
    };
  },
  mounted() {
    // socket客户端向服务端通讯,每次访问当前页面,通过visitedServer更新访问量
    this.$socket.emit("visitedServer");
  },
  sockets: {
    // 成功链接的回调
    connect: function () {
      console.log("socket connected");
    },
    // 初始化调用io.controller.visited.server
    // CustomVisited 接受的socket.io传递过来的 visited访问量
    CustomVisited: function (visited) {
      console.log("前端收到了客户端的消息", visited);
      this.visited = visited;
    },
  },
};
</script>

<style></style>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值