如果我在创建客户端后没有立即连接,则使用 sockjs-client 和 stompjs 的 WebSocket 无法连接

Hea*_*ren 2 javascript websocket sockjs

我只在页面加载时尝试连接到远程一次,然后在必要时订阅频道。

为了保证代码可以被不同页面共享,我编写了如下代码(闭包),并将函数导出webSocket为:

export function webSocket() {
  const socket = new SockJS(WebSocketEndPoint.RESOURCE_CONTROLLER);
  const stompClient = Stomp.over(socket);
  let isConnected = false;
  function subscribe(address, callback) {
    if (isConnected) {
      stompClient.subscribe(address, callback);
    } else {
      stompClient.connect({}, () => {
        isConnected = true;
        stompClient.subscribe(address, callback);
      });
    }
  };
  function subscribeRealtimeExecOutput(addr, callback){ 
      subscribe(addr, callback);
  }

  return {
    subscribeRealtimeExecOutput,
  };
}
Run Code Online (Sandbox Code Playgroud)

在其他页面中使用如下:

import { webSocket } from '../../websocket/websocketService';

//in the constructor
this.subscriber = webSocket().subscribeRealtimeExecOutput;

//used when required
this.subscriber(pane.jobIdentifier, (data) => {
  console.log(data);
});
Run Code Online (Sandbox Code Playgroud)

我希望该connect方法仅在同一页面内运行一次,然后订阅者将根据连接订阅不同的频道。

但是,它似乎不起作用 - 连接将不会建立,因此浏览器只会提示我打开 Web 套接字...

有人可以帮忙吗?非常感谢你的帮助。

此致, 赫伦

Hea*_*ren 6

我自己在本地测试后发现,创建客户端并直接连接到服务器后,一切都非常顺利。所以我重构了我的订阅代码如下:

function subscribe(address, callback) {
    if (isConnected) {
      stompClient.subscribe(address, callback);
    } else {
      stompClient = Stomp.over(socket);
      isConnected = true;
      stompClient.connect({}, () => {
        stompClient.subscribe(address, callback);
      }, () => {
        console.error('Sorry, I cannot connect to the server right now.');
      });
    }
  }
Run Code Online (Sandbox Code Playgroud)

如果连接仍未建立,我会再次创建客户端并设置isConnected目录并连接到服务器。

后来,我只是对发生的事情感到好奇,并寻找一些有趣的东西:

http://jmesnil.net/stomp-websocket/doc/

创建 STOMP 客户端后,它必须调用其 connect() 方法来有效连接 STOMP 服务器并对其进行身份验证。

除了

但如果连接失败怎么办?connect() 方法接受一个可选的 error_callback 参数,如果客户端无法连接到服务器,将调用该参数。

还有来自stackoverflow的帖子,进一步证实了我的重构

我创建了一个新的 Stomp.Client 实例,因为当前实例的 Web 套接字已关闭,并且一旦关闭,就无法重新打开 Web 套接字。