zoukankan      html  css  js  c++  java
  • 前台:VueSocketIOExt+socket.io-client,后台socket.io的聊天环境搭载

    一、前台

    本来我是直接使用socket.io-client,但是不知道是我没有跨域还是什么原因,最开始的时候安装官方文档的做法,老是不能成功建立连接,所以我就再下载了一个VueSocketIOExt,它依赖于socket.io-client并扩展了socket.io-client。

    所以前台需要做的如下:

    1. 下载socket.io-client与VueSocketIOExt

    npm install vue-socket.io-extended socket.io-client --save

    2.在main.js或者单独建立一个js文件引入下面内容:

    import Vue from 'vue'
    import io  from "socket.io-client";//socket
    import VueSocketIOExt from 'vue-socket.io-extended';
    const socket = io('/');//此处为需要和后台建立链接的地址,前端一般要跨域处理 本来此处根据下面的跨域处理应该为onst socket = io('/socket.io'),但是我发现默认socket访问的地址就带有socket.io,所以此处我直接一根斜杆即可。这里随机应变
    Vue.use(VueSocketIOExt, socket);

    3.跨域处理。 新建vue.config.js并输入以下内容(只看跨域部分处理即可,下面我贴了我的项目的所有配置):

    const webpack = require("webpack");
    module.exports = {
      configureWebpack: {
        resolve: {
          alias: {
            'assets': "@/assets", //静态资源文件夹
            // 'common': "@/common", //工具包文件夹
            'components': '@/components', //组件文件夹
            'network': '@/network', //网络请求文件夹
            'views': '@/views', //视图文件夹
            'util': '@/util' //工具类文件夹
          }
        },
        //支持jquery
        plugins: [
          new webpack.ProvidePlugin({
            $: "jquery",
            jQuery: "jquery",
            "windows.jQuery": "jquery"
          })
        ]
      },
      //    // 配置跨域
      devServer: {
        //设置代理
        proxy: {
          "/api_hu66": {
            // 允许访问数据的计算机名称
            target: 'http://localhost:3000',
            ws: true, //启用webSocket
            changeOrigin: true, //开启代理跨域
            pathRewrite: {
              // 重写api地址
              '^/api_hu66': ""
            }
          },
          "/api_soTi": {
            // 允许访问数据的计算机名称
            // target: 'http://api.51aidian.com/api/cha.php',
            target: 'http://api.51aidian.com',
            ws: true, //启用webSocket
            changeOrigin: true, //开启代理跨域
            pathRewrite: {
              // 重写api地址
              '^/api_soTi': ""
            }
          },
          '/socket.io': {//此处为socket跨域
            target: 'http://localhost:3000',
            ws: true,
            changeOrigin: true
          },
          //  'sockjs-node': {
          //   target: 'http://localhost:3000',
          //   ws: false,
          //   changeOrigin: true
          //  },
        },
        disableHostCheck: true
      }
      //   css: {
      //     extract: true, // 是否使用css分离插件 ExtractTextPlugin
      //     sourceMap: false, // 开启 CSS source maps?
      //     loaderOptions: {
      //         scss: {
      //           prependData: `
      //           @import "@/assets/scss/my.scss";
      //         `
      //         }
      //     }, // css预设器配置项
      //     requireModuleExtension: false // 启用 CSS modules for all css / pre-processor files.
      // },
    }

    4.新建chat.vue进行测试,在created生命周期里面输入以下内容

     // 1.聊天套接字
          //告诉后台,用户进入聊天界面,此时后台会回传未读消息
                        this.$socket.client.emit('send message', {
                            msg: "用户进入chat",
                            users: localStorage.Login_user
                        });

    二、后台:

    1.下载

    npm install socket_io --save

    2.新建mySocket.js

    var socket = {}
    var socket_io = require('socket.io');
    function getSocket(server){
    
      var io = require('socket.io')(server);
       // var io = socket_io.listen(server);//监听传入的server
       
         // 10.1connection监听单个连接.
       io.on('connection',function(socket){
        console.log("**************************************");
         console.log("我来了,宝贝");
         console.log("id为:"+socket.id+"的用户成功建立连接!");
         io.emit('this', { will: 'be received by everyone'})
         socket.on('send message',(data)=>{  
          console.log("接收到用户:"+socket.id+"的一条消息,消息实体对象信息为:",data)  
          // 通过new message事件给对应的socketID发送数据  
          socket.to(data.toSocketID).emit('new message',data);  
          });   
      /****************************************************************************** */
         //10.2监听进入聊天模块
         socket.on('enterChat',async()=>{
           console.log("该用户上线")
         })
    
      /****************************************************************************** */
         //10.3监听已读,已读则把已读标签设置为true
         socket.on("hasRead",async(data)=>{
            
        })
    
      /****************************************************************************** */   
        // 10.4监听断开
        socket.on('disconnect',async(reason)=>{
          console.log("id为"+socket.id+"的用户端口断开……断开原因:"+reason);
        })
      });
       console.log("启动socket...")
     }
    
    socket.getSocket = getSocket;
    //导出socket
    module.exports = socket

    3.app.js导入

    let express = require("express")
    let app = express()
    var port = ('3000');
    app.set('port', port);
    var http = require('http');
    // // 套接字模块
    //创建HTTP server
    var server = http.createServer(app);
    // // 导入socket的封装方法
    var socket = require("./weteach_routes/mySocket")
    socket.getSocket(server)
    //此处变成http listen
    server.listen(port);
    // app.listen(3000,()=>{console.log("服务器启动……")})
    // 导出
    module.exports = app;

    测试结果:

    穷则独善其身,达则兼济天下……
  • 相关阅读:
    JavaScript面向对象之类的创建
    VSCode Debug模式下各图标 含义
    Visual Studio icon 含义
    Unity坐标系 左手坐标系 图
    Unity类继承关系 图
    Unity的SendMessage方法
    ONGUI->NGUI->UGUI (Unity UI史)
    Console.WriteLine 不会输出到unity控制台
    Chrome添加Unity本地文档引擎
    Unity "Build failed : Asset is marked as don't save " 解决方案
  • 原文地址:https://www.cnblogs.com/hmy-666/p/14723380.html
Copyright © 2011-2022 走看看