当前位置:   article > 正文

vue使用socket.io-client实现实时通信(结合使用AMQP协议的RabbitMQ)_vue socket.io-client

vue socket.io-client

场景示意图

 

 

第一步 创建一个nodejs的http服务器,用来发送消息到rabbitmq

创建第一个http服务器,监听60000端口

创建文件夹,命名为RabbitMQServer01 ,然后创建一个 server.js 文件

引入3个依赖

npm install express amqplib body-parser

以下是我的依赖版本

编写server.js

  1. const express = require('express');
  2. const http = require('http');
  3. const app = express();
  4. const server = http.createServer(app);
  5. const amqp = require('amqplib/callback_api');
  6. var bodyParser = require('body-parser');
  7. app.use(bodyParser.json());
  8. app.use(bodyParser.urlencoded({ extended: false }));
  9. app.post('/',(request, response) => {
  10. let orderData = request.body;
  11. console.log(orderData);
  12. sendOrderToQueue(JSON.stringify(orderData));
  13. response.end();
  14. });
  15. function sendOrderToQueue(obj){
  16. let url = {
  17. protocol: 'amqp',
  18. hostname: '10.211.55.12',
  19. port: 5672,
  20. username: 'heima',
  21. password: 'heima',
  22. vhost: '/itcast'
  23. }
  24. amqp.connect(url,(connError, connection)=>{
  25. if(connError){
  26. throw connError;
  27. }
  28. connection.createChannel((channelError,channel)=>{
  29. if(channelError){
  30. throw channelError;
  31. }
  32. const QUEUE = 'orderQueue';
  33. channel.assertQueue(QUEUE);
  34. channel.sendToQueue(QUEUE,Buffer.from(obj));
  35. console.log(`message send${QUEUE}`);
  36. channel.close(function () {
  37. connection.close();
  38. })
  39. });
  40. });
  41. }
  42. server.listen(60000,() => {
  43. console.log("server is up and running on port 60000");
  44. });

启动服务,监听60000端口

node src/http/server.js 

 

第二步 创建一个vue-cli脚手架,作为客户端,客户端里边也有一个http服务器,监听60001端口

vue init webpack vuesocket_and_rabbitmq_demo

引入多个依赖, 分别是 vue-socket.io , socket.io-client , socket.io , express , amqplib

npm install vue-socket.io socket.io-client socket.io express amqplib

在main.js导入依赖,并且使用它

  1. import VueSocketIO from 'vue-socket.io'
  2. import SocketIO from 'socket.io-client'
  3. Vue.use(new VueSocketIO({
  4. debug: true,
  5. connection: SocketIO('ws://127.0.0.1:60001')
  6. }));

配置proxyTable代理,以解决CORS跨域问题

  1. proxyTable: {
  2. '/socket.io':{
  3. target: 'http://127.0.0.1:60001/', // target host
  4. changeOrigin: true, // needed for virtual hosted sites
  5. logLevel: 'debug'
  6. },
  7. '/sockjs-node': {
  8. target: 'http://127.0.0.1:60001',
  9. ws: false,
  10. changeOrigin: true
  11. }
  12. }

创建第二个http服务器,监听60001端口

在本vue-cli脚手架项目的 src目录下新建一个config目录,新建一个receiver.js文件,这是用来监听消息队列的,如果消息队列里面一旦有数据,就会马上执行消费操作

编写receiver.js文件

(10.211.55.12是安装了RabbitMQ的虚拟机)

  1. const express = require('express');
  2. const http = require('http');
  3. const socketIO = require('socket.io');
  4. const app = express();
  5. const server = http.createServer(app);
  6. const amqp = require('amqplib/callback_api');
  7. const io = socketIO(server,{
  8. cors: {
  9. origin: '*'
  10. }
  11. });
  12. io.on('connection',() => {
  13. console.log('user connected');
  14. });
  15. let url = {
  16. protocol: 'amqp',
  17. hostname: '10.211.55.12',
  18. port: 5672,
  19. username: 'heima',
  20. password: 'heima',
  21. vhost: '/itcast'
  22. }
  23. amqp.connect(url,(connError, connection)=>{
  24. if(connError){
  25. throw connError;
  26. }
  27. connection.createChannel((channelError, channel)=>{
  28. if(channelError){
  29. throw channelError;
  30. }
  31. const QUEUE = 'orderQueue';
  32. channel.assertQueue(QUEUE);
  33. channel.consume(QUEUE,(msg)=>{
  34. /*监听消息队列,一旦有客户订单生产,马上触发消费,
  35. 把消费的信息发送给目标订单管理员的客户端
  36. */
  37. io.emit('clientOrder',msg.content.toString());
  38. },{
  39. noAck: true
  40. })
  41. })
  42. });
  43. server.listen(60001,() => {
  44. console.log("server is up and running on port 60001");
  45. });

 

在HelloWorld.vue组件中,编写接收消息的代码

在<script>标签里边,引入socket.io-client包,并且连接到127.0.0.1:60001的http服务器

  1. import io from 'socket.io-client';
  2. const socket = io('http://127.0.0.1:60001');

编写监听客户订单的代码

  1. created() {
  2. socket.on('clientOrder',(data) =>{
  3. console.log(data)
  4. });
  5. }

启动第二个http服务器,监听60001端口(用来消费rabbitmq的信息,然后把消费的信息通过socket转发给前端进行实时渲染)

node src/config/receiver.js

启动客户端

npm run dev

第三步 测试

使用Postman发送一个post请求,相当于模拟一个老百姓在京东买了一个东西,提交了一个订单发送请求,委托60000端口服务器把这个订单数据发送给10.211.55.12:5672机子上的RabbitMQ上,然而,订单管理员正在监听 60001 端口的服务器,即监听RabbitMQ的机子上有没有新的订单产生,发现有订单产生了,那么马上消费,把消费的数据通过socket.emit('clientOrder',{orderData}) 这样子的socket方法,从60001服务器发送给订单管理员的前端界面,这时候,订单管理员的前端界面就会实时渲染

订单管理员看到了实时更新的数据:(这是浏览器控制台,访问的是是HelloWorld.vue的界面)

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/人工智能uu/article/detail/814722
推荐阅读
相关标签
  

闽ICP备14008679号