当前位置: 首页 > 知识库问答 >
问题:

前端 - Vue 通过@stomp/stompjs建立长链接 无法进入connect链接成功的回调 是什么原因?

高锦
2024-07-12

Vue 通过@stomp/stompjs建立长链接 无法进入connect回调

<template>
  <div>
    <h1>WebSocket 长连接示例</h1>
    <button @click="startConnection">开始连接</button>
    <button @click="stopSubscription" :disabled="!isConnected">取消订阅</button>
    <button @click="closeConnection" :disabled="!isConnected">关闭连接</button>
    <input v-model="messageToSend" placeholder="输入消息">
    <button @click="sendMessage" :disabled="!isConnected">发送消息</button>
    <div v-if="receivedMessage">
      <h2>收到的消息:</h2>
      <p>{{ receivedMessage }}</p>
    </div>
  </div>
</template>

<script>
import { Stomp } from '@stomp/stompjs';

export default {
  data() {
    return {
      client: null,
      subscription: null,
      url: 'ws://127.0.0.1:9000',
      topic: '/topic/test',
      customHeaders: {},
      isConnected: false,
      receivedMessage: null,
      messageToSend: '',
    };
  },
  methods: {
    startConnection() {
      console.log('尝试连接到', this.url);
      this.client = Stomp.client(this.url);

      this.client.configure({
        connectHeaders: this.customHeaders,
        heartbeatIncoming: 10,
        heartbeatOutgoing: 20,
        onConnect: (frame) => {
          console.log('连接成功', frame);
          this.isConnected = true;
          this.subscription = this.client.subscribe(this.topic, (message) => {
            console.log('收到消息', message.body);
            this.receivedMessage = message.body;
          });
        },
        onStompError: (error) => {
          console.error('STOMP 错误', error);
          this.handleConnectionError(error);
        },
        onWebSocketClose: (event) => {
          console.error('连接关闭', event);
          this.isConnected = false;
        },
        onWebSocketError: (event) => {
          console.error('WebSocket 错误', event);
          this.handleConnectionError(event);
        },
        debug: (str) => {
          console.log('+++++ DEBUG +++++');
          console.log(new Date(), str);
        }
      });

      this.client.activate();
    },
    stopSubscription() {
      if (this.subscription) {
        this.subscription.unsubscribe();
        console.log('取消订阅');
      }
    },
    closeConnection() {
      if (this.client && this.isConnected) {
        this.client.deactivate(() => {
          console.log('关闭连接');
          this.isConnected = false;
        });
      }
    },
    sendMessage() {
      if (this.client && this.isConnected) {
        const message = { text: this.messageToSend };
        this.client.publish({ destination: this.topic, body: JSON.stringify(message) });
        console.log('消息已发送', message);
      } else {
        console.log('WebSocket 未连接');
      }
    },
    handleConnectionError(error) {
      console.error('WebSocket 连接错误', error);
      this.isConnected = false;
    }
  },
};
</script>

<style scoped>
button {
  margin: 10px;
}

input {
  margin: 10px;
}
</style>
const WebSocket = require('ws');

// 指定自定义端口号
const PORT = 9000;

const server = new WebSocket.Server({ port: PORT });

server.on('connection', (ws) => {
  console.log('客户端已连接');

  ws.on('message', (message) => {
    console.log(`收到消息: ${message}`);
     
    // 发送响应消息
    ws.send(`服务器收到: ${message}`);
  });

  ws.on('close', () => {
    console.log('客户端已断开连接');
  });

  ws.on('error', (error) => {
    console.log(`WebSocket 错误: ${error}`);
  });
});

console.log(`WebSocket 服务器在 ws://localhost:${PORT} 运行`);

如上分别为前后端代码 点击开始链接 启动后端ws服务 后端控制台提示客户端已连接,但是前端onConnect回调一直无法进入 ,只有debug事件回调正常

目前不确定是否真正建立了链接 希望获取onConnect的回调事件

共有1个答案

夹谷和裕
2024-07-12

是版本不同的缘故么,看着跟官方示例不太一样
https://github.com/stomp-js/stompjs

<!--
    JSPM Generator Import Map
    Edit URL: https://generator.jspm.io/#U2NgYGBkDM0rySzJSU1hcCguyc8t0AeTWcUO5noGega6SakliaYAYTzJAykA
  -->
<script type="importmap">
  {
    "imports": {
      "@stomp/stompjs": "https://ga.jspm.io/npm:@stomp/stompjs@7.0.0/esm6/index.js"
    }
  }
</script>

<!-- ES Module Shims: Import maps polyfill for modules browsers without import maps support (all except Chrome 89+) -->
<script
  async
  src="https://ga.jspm.io/npm:es-module-shims@1.5.1/dist/es-module-shims.js"
  crossorigin="anonymous"
></script>

<script type="module">
  import { Client } from '@stomp/stompjs';

  const client = new Client({
    brokerURL: 'ws://localhost:15674/ws',
    onConnect: () => {
      client.subscribe('/topic/test01', message =>
        console.log(`Received: ${message.body}`)
      );
      client.publish({ destination: '/topic/test01', body: 'First Message' });
    },
  });

  client.activate();
</script>
import { Client } from '@stomp/stompjs';

import { WebSocket } from 'ws';
Object.assign(global, { WebSocket });

const client = new Client({
  brokerURL: 'ws://localhost:15674/ws',
  onConnect: () => {
    client.subscribe('/topic/test01', message =>
      console.log(`Received: ${message.body}`)
    );
    client.publish({ destination: '/topic/test01', body: 'First Message' });
  },
});

client.activate();
 类似资料:
  • 本文向大家介绍什么是Linux软链接和Linux硬链接,包括了什么是Linux软链接和Linux硬链接的使用技巧和注意事项,需要的朋友参考一下 Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为软链接(Symbolic Link)。默认情况下,ln命令产生硬链接。 一、[硬链接]-->指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都

  • 问题内容: 我有一个定义如下的指令- 我遇到的问题是从未调用Link函数。谢谢! PS编译逻辑的原因是该指令是递归的。 问题答案: 如果您的意思是未调用,则很清楚:编译函数已返回链接函数。定义为不再重要,将被忽略。

  • 主要内容:编译(Compile),链接(Link),总结我们平时所说的程序,是指双击后就可以直接运行的程序,这样的程序被称为 可执行程序(Executable Program)。在 Windows 下,可执行程序的后缀有 和 (其中 比较常见);在类 UNIX 系统(Linux、Mac OS 等)下,可执行程序没有特定的后缀,系统根据文件的头部信息来判断是否是可执行程序。 可执行程序的内部是一系列计算机指令和数据的集合,它们都是二进制形式的,CPU 可

  • 本文向大家介绍在python中进行编译和链接的过程是什么?,包括了在python中进行编译和链接的过程是什么?的使用技巧和注意事项,需要的朋友参考一下 编译:python中的源代码保存为.py文件,然后将其编译为称为字节码的格式,然后将字节码转换为机器码。编译后,代码存储在.pyc文件中,并在更新源代码时重新生成。此过程称为编译。 链接:链接是最后一个阶段,其中所有功能都与它们的定义链接在一起,因

  • 本文向大家介绍建立软链接(快捷方式),以及硬链接的命令。相关面试题,主要包含被问及建立软链接(快捷方式),以及硬链接的命令。时的应答技巧和注意事项,需要的朋友参考一下 答案: 软链接: ln -s slink source 硬链接: ln link source

  • 问题内容: 我正在尝试通过Selenium进行网络抓取。我的问题很简单:如何找到链接,然后如何单击它?例如:以下是我要网页抓取的HTML: 因此,如您所见,“详细信息”是一个链接。 如何使用Selenium找到该链接并单击它? 问题答案: 您可以使用: 例如: 要单击它,只需调用click方法:

  • 问题内容: 我不明白在代码中具有链接异常的好处。 考虑到Java世界中的ResourceLoader示例,如果程序员知道遇到这种情况的可能性,为什么不捕获相同的异常呢?否则,程序员不必抛出新的实例,就可以在同一代码中捕获这两个异常? 问题答案: 任何人都可以提供有关需要链接异常的信息吗? 文章说得很好: 异常链接允许您将一种异常类型映射到另一种异常类型,以便方法可以抛出与该方法本身处于相同抽象级别

  • 本文向大家介绍什么是JavaScript中的函数链接?,包括了什么是JavaScript中的函数链接?的使用技巧和注意事项,需要的朋友参考一下 功能链 函数链接不过是使用点表示法将函数分组在一行中而已。这种类型的链接使代码非常简洁,并提高了性能。在这里,我们将学习使用常规对象进行函数链接。 a)没有功能链  在以下示例中的对象“OBJ”被创建并在该对象中的公共属性 称为“I”是使用关键字创建“这个