猿创征文|vue中SocketIO的正确使用方法,并且解决跨域问题

这篇具有很好参考价值的文章主要介绍了猿创征文|vue中SocketIO的正确使用方法,并且解决跨域问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

工作中用到了消息推送功能,之前了解过SOCKET 无意中了解到即时通讯框架SocketIO 简单说两句

Socket.IO 是什么

Socket.IO是一个库,基于 Node.js 的实时应用程序框架。可以在浏览器和服务器之间实现实时,双向和基于事件的通信。它适用于每个平台、浏览器或设备,同样注重可靠性和速度。

Socket.IO 起源

WebSocket 的产生源于 Web 开发中日益增长的实时通信需求,对比基于 http 的轮询方式,它大大节省了网络带宽,同时也降低了服务器的性能消耗。
WebSocket 协议在2008年诞生,2011年成为国际标准。虽然主流浏览器都已经支持,但仍然可能有不兼容的情况,为了兼容所有浏览器,就诞生SocketIO。
SocketIO将WebSocket、AJAX和其它的通信方式全部封装成了统一的通信接口,也就是说,我们在使用SocketIO时,不用担心兼容问题,底层会自动选用最佳的通信方式。

Socket.io有什么特点

易用性:Socket.io封装了服务端和客户端,使用起来非常简单方便。
跨平台:Socket.io是跨平台的,可以实现多平台的即时通讯,Socket.io支持跨平台,这就意味着你有了更多的选择,可以在自己喜欢的平台下开发实时应用。由于 iOS 端进行 socket 编程主要使用 GCDAsyncSocket 框架,但要实现 Android、iOS、web 多平台的通讯,还是选择统一的框架或协议比较好。
自适应:Socket.io 实现了实时双向的基于事件的通讯机制,是基于 webSocket 的封装,但它不仅仅包括 webSocket,还对轮询(Polling)机制以及其它的实时通信方式封装成了通用的接口,并且在服务端实现了这些实时机制的相应代码,它会自动根据浏览器从WebSocket、AJAX长轮询、Iframe流等等各种方式中选择最佳的方式来实现网络实时应用,非常方便和人性化,而且支持的浏览器最低达IE5.5。

好了废话不多说开始干活。

正文

第一步 创建nodeJS的http服务器,作为socket服务端

新建文件夹,命名为NodejsScoketDemo,然后使用终端,npm init ,一路回车即可

加入express依赖和socket.io依赖

npm install express socket.io

这是我使用的依赖版本
猿创征文|vue中SocketIO的正确使用方法,并且解决跨域问题
工程目录如图:

猿创征文|vue中SocketIO的正确使用方法,并且解决跨域问题

socket.js代码

const express = require('express');
const http = require('http');
const socketIO = require('socket.io');
const app = express();
const server = http.createServer(app);
  
const io = socketIO(server,{
    cors: {
        origin: '*'
    }
});
  
io.on('connection',(socket) => {
    console.log('user connected');
    socket.on('hello',(data) => {
        console.log(`收到客户端的消息:${data}`);
    })
});
  
  
app.get('/',(request, response) => {
    /*在浏览器发送 http://127.0.0.1:24000 的请求,客户端定义了监听'message'的socket,所以可以接收消息,即使客户端有代码
        io.on('message',(data) => {
            console.log(data);
        });
    */
    io.emit('message','服务端向客户端推送消息...');
    response.writeHead(200, {"Content-type": "text/plain"});
    response.end();
});
  
  
server.listen(24000,() => {
    console.log("server is up and running on port 24000");
});

谷歌度娘,十有八九都是说配置前端的config目录下的index.js文件的代理,结果都是无效的,仍然报跨域被阻止的错误,其实关键不是说这个代理不用设置,要设置。关键在

(下边这块代码仅用来说明展示,上面已经有了,不用再重复写了)

const io = socketIO(server,{
    cors: {
        origin: '*'
    }
});

那么这时候,我们就可以直接使用命令启动socket.js ,开启http服务器,并且监听24000端口

node src/socket/socket.js

第二步 创建vue-cli脚手架,作为socket客户端

npm init webpack vuesocketdemo

引入依赖

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

这些是我引入的依赖版本,理论上,只引入socket.io-client 依赖就够了
猿创征文|vue中SocketIO的正确使用方法,并且解决跨域问题

我们在main.js导入依赖,并且使用它,SocketIO里面填写ws://IP:监听的服务器端口

import Vue from 'vue'
import App from './App'
import router from './router'

import VueSocketIO from 'vue-socket.io'
import SocketIO from 'socket.io-client'

Vue.config.productionTip = false

Vue.use(new VueSocketIO({
  debug: true,
  connection: SocketIO('ws://127.0.0.1:24000')
}));

new Vue({
  el: '#app',
  router,
  components: { App },
  template: '<App/>'
})

接下来,我们在conifg的index.js文件中配置代理,注意,第二个代理路劲的ws属性必须设置为false,否则还会报跨域被阻止的错误

    proxyTable: {
      '/socket.io':{
        target: 'http://127.0.0.1:24000/', // target host
        changeOrigin: true, // needed for virtual hosted sites
        logLevel: 'debug'
      },
      '/sockjs-node': {
        target: 'http://127.0.0.1:24000',
        ws: false,
        changeOrigin: true
      }
    },

最后,我们在HelloWorld.vue 编写socket代码
在html部分,编写一个按钮和输入框,用来发送消息给服务器

<template>
  <div class="hello">
    <input id="inputArea" type="text">
    <button @click="sendMsgToServer">hello发送消息给服务端</button>
    <button @click="getMsgToServer">获取服务器信息</button>
  </div>
</template>

在javascript部分,连接到服务器,并且编写一个发送输入的消息给服务器的程序

<script>
import io from 'socket.io-client';
const socket = io('http://127.0.0.1:24000');
export default {
  name: 'HelloWorld',
  data () {
    return {
      msg: 'Welcome to Your Vue.js App'
    }
  },
  methods:{
    /*socket.emit('hello','xxx') 表示,服务端上定义了一个监听'hello'的socket,
      即服务端有代码
      socket.on('hello',(data) => {
        //这是接收到的客户端消息
        console.log(data);
      })
       */
    sendMsgToServer(){
      socket.emit('hello',document.getElementById("inputArea").value);
    }
  },
  created() {
    //一定要移除旧的message监听,否则会出现重复监听的状况
    socket.removeListener('message');
    //这是移除所有监听
    // socket.removeAllListeners();
    console.log('这是移除所有监听');
    socket.on('message',(data) =>{
      console.log(data)
    });
  }
}
</script>

样式部分我就没定义了

第三步 测试

服务端启动http服务器以监听socket 24000端口

node src/socket/socket.js

启动客户端vue

npm run dev

测试浏览器发送请求给http服务器,委托http服务器把消息推送给客户端

猿创征文|vue中SocketIO的正确使用方法,并且解决跨域问题

测试浏览器发送请求给http服务器,委托http服务器把消息推送给客户端

测试客户端发送消息给服务端
猿创征文|vue中SocketIO的正确使用方法,并且解决跨域问题

猿创征文|vue中SocketIO的正确使用方法,并且解决跨域问题

猿创征文|vue中SocketIO的正确使用方法,并且解决跨域问题

结束

到此Nodejs的服务器端和vue的客户端已经正常跑起来啦,撒花撒花…

接下来还有其它SockectIO的使用陆续更新,未完续待…
我的Demo源码给出仅供大家参考,如有问题欢迎大家交流沟通,一起学习进步

链接: https://pan.baidu.com/s/1lmxPa4FJ8enHKGAvWleJFQ 提取码: CSDN 复制这段内容后打开百度网盘手机App,操作更方便哦文章来源地址https://www.toymoban.com/news/detail-419759.html

到了这里,关于猿创征文|vue中SocketIO的正确使用方法,并且解决跨域问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 正确使用 equals 方法

    Object的equals方法容易抛空指针异常,应使用常量或确定有值的对象来调用 equals。 举个例子: 运行上面的程序会抛出空指针异常,但是我们把第二行的条件判断语句改为下面这样的话,就不会抛出空指针异常,else 语句块得到执行。: 不过更推荐使用 java.util.Objects#equals (JDK

    2024年02月14日
    浏览(43)
  • 如何正确使用 JavaScript 中的 slice() 方法

    在 JavaScript 中, slice() 是一个常用的数组方法,用于从现有数组中提取一部分元素,然后返回一个新的数组。它是一个非常有用的工具,可以帮助你在不改变原始数组的情况下操作数组的子集。本文将介绍 slice() 的基本概念、使用方法、实践案例和互动练习,以帮助你更好地

    2024年01月18日
    浏览(38)
  • 使用 FreeRTOS 时使用 GPIO 监控 CPU 负载的正确方法?

    总目录链接== AutoSAR入门和实战系列总目录 总目录链接== AutoSAR BSW高阶配置系列总目录 我想切换一些 GPIO 以监控 CPU 活动和 FreeRTOS 上下文。更具体地说,我想: 在 CPU 休眠时让 GPIO 处于逻辑低状态,在 CPU 运行时(任务、中断中)让 GPIO 处于逻辑状态高, 当 CPU 在工作时,GP

    2023年04月17日
    浏览(36)
  • 猿创征文 | Shell编程【上篇】

    目录 1,Shell编程 1.1:简介 1.1.1:shell解释器 1.2:快速入门 1.2.1:编写脚本 1.2.2:执行shell脚本 1.3:shell变量 1.3.1:简介 1.3.2:使用变量 1.3.3:删除变量 1.3.4:只读变量  1.4:字符串 1.4.1:单引号 1.4.2:双引号  1.4.3:获取字符串长度   1.4.4:提取子字符串  1.5:传递参数 1

    2024年02月02日
    浏览(59)
  • 猿创征文 |【Linux】常用命令

    🍁 博客主页: 👉@不会压弯的小飞侠 ✨ 欢迎关注: 👉 点赞 👍 收藏 ⭐ 留言 ✒ ✨ 系列专栏: 👉Linux专栏 ✨ 欢迎加入社区: 👉不会压弯的小飞侠 ✨ 人生格言:知足上进,不负野心。 🔥 欢迎大佬指正,一起学习!一起加油! command [-options] [parameter] command:命令名 [-o

    2024年01月16日
    浏览(39)
  • Python 爬虫使用代理 IP 的正确方法

    代理 IP 是爬虫中非常常用的方法,可以避免因为频繁请求而被封禁。下面是 Python 爬虫使用代理 IP 的正确方法: 1. 选择可靠的代理 IP 供应商,购买或者免费使用代理 IP 列表。 2. 在爬虫中使用第三方库 requests ,并在 requests.get() 或 requests.post() 请求时添加代理 IP 参数,例如:

    2024年02月11日
    浏览(111)
  • 猿创征文|【HTML】标签学习之路

    💖 目录 一、HTML语法规范 1.基本语法概述 2.标签关系 二、HTML基本结构标签 1.第一个HTML页面 2.HTML基本结构标签总结 1.基本语法概述 html是由尖括号包围的,列如: html 。 html标签通常是成对出现的,列如:html和/html,我们称为 双标签 。标签对里的第一个标签是开始标

    2024年01月16日
    浏览(43)
  • 猿创征文| redis基本数据类型

    📃个人主页:不断前进的皮卡丘 🌞博客描述:梦想也许遥不可及,但重要的是追梦的过程,用博客记录自己的成长,记录自己一步一步向上攀登的印记 🔥个人专栏:微服务专栏 ✔️redis常见的操作命令:http://www.redis.cn/commands.html 命令 功能 keys * 查看当前库的所有key exists key 判断

    2023年04月08日
    浏览(42)
  • 以太坊是什么?|猿创征文

    以太坊是一个可编程、可视化、更易用的区块链,它允许任何人编写智能合约和发行代币。 在以太坊(Ethereum)出现之前,各种区块链应用的功能非常有限,例如,比特币和其他加密货币都只是纯粹的数字货币。 以太坊(Ethereum)创始人Vitalik Buterin将以太坊(Ethereum)设想为开发人员

    2024年02月02日
    浏览(73)
  • 猿创征文|ZooKeeper(伪)集群搭建

    前言:zookeeper作为一款分布式协调中间件,其重要性不言而喻,因此需要保证其高可用性。所以一般都会搭建zookeeper集群,今天叶秋带领大家在一台服务器上搭建伪集群。 目录 1、 搭建要求 2、 准备工作 3、 配置集群  4 启动集群  5 模拟集群异常 1、 搭建要求 真实的集群是

    2024年02月01日
    浏览(71)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包