【问题标题】:How to retrieve RSocket Data to different tabs?如何将 RSocket 数据检索到不同的选项卡?
【发布时间】:2021-09-07 13:52:51
【问题描述】:

这是我的代码,它只适用于我所在的标签。我收到回复,似乎一切正常,但我仍然不完全了解该技术的操作,这就是我去找你的原因。

以“responseHanlder”结尾

connect() {
    // backend ws endpoint
    const wsURL = "ws://localhost:6565/rsocket";

    // rsocket client
    const client = new RSocketClient({
      serializers: {
        data: JsonSerializer,
        metadata: IdentitySerializer,
      },
      setup: {
        keepAlive: 60000,
        lifetime: 180000,
        dataMimeType: "application/json",
        metadataMimeType: "message/x.rsocket.routing.v0",
      },
      transport: new RSocketWebSocketClient({
        url: wsURL,
      }),
    });
    
    client.connect()
          .then((sock) => {
               document.getElementById("connect")
                       .addEventListener("click", (event) => {
                          numberRequester(sock);
                       });
          }, errorHanlder);

    /*Aquí comienza el código del primer socket para insertar un producto
    antes de enviar la notificación primero realiza una acción*/
    const numberRequester = (socket) => {
    
            socket
                .requestResponse({
                  data: {
                    id: null,
                    subscriber: retrieveData.id,
                    titulo: "Se insertó un nuevo producto",
                    descripcion:
                    "Aquí se agrega una descripcion breve de lo que se acaba de hacer (opcional)",
                    fecha_inicio: today,
                    fecha_final: final,
                    leido: false,
                  },
                  metadata:
                    String.fromCharCode("insert.notification".length) +
                    "insert.notification",
                })
                .subscribe({
                  onComplete: responseHanlder,
                  onError: errorHanlder,
                  onNext: responseHanlder,
                  onSubscribe: (subscription) => {
                    //subscription.request(100); // set it to some max value
                  },
                });
            }


    // error handler
    const errorHanlder = (e) => console.log(e);
    // response handler
    const responseHanlder = (payload) => {
      this.sendNotification(payload.data);
    };
} 

发送数据后,我的 rsocket 接收信息,然后我收到包含所需数据的响应。目前,它仅在运行它的选项卡中有效,但我需要在其他选项卡中反映该信息,因为它是通知的原型。

【问题讨论】:

  • “其他标签”是指浏览器的标签?
  • 不同的标签页......好吧,他们宁愿是不同会话或浏览器中的不同用户,我不知道我是否解释自己。感谢您的回答。
  • 我想我明白了,你的意思是不同的客户。
  • 是的,谢谢,因为我有一个响应,它在执行 requestResponse 的客户端中有效,但在其他客户端中并没有反映给我。不知道有没有办法解决这个问题,我觉得应该可以,因为这就像使用套接字一样,对吧?
  • 出于安全原因,我相信浏览器选项卡会分开。我怀疑实现这一点的最佳方法是服务器向同一用户的所有连接广播。

标签: vue.js reactive-programming spring-webflux rsocket


【解决方案1】:

RSocket 是有状态的、面向会话的应用协议

这意味着,每次您的 RSocket 客户端连接到服务器时,它都会打开一个连接并通过它与您的服务器通信。

如果客户端是浏览器,出于安全原因,其他浏览器会话将无法访问您的连接。

如何通过 rsocket 广播消息

其实在浏览器的情况下,可以使用2个选项:

经纪人类型的消息传递

您始终可以连接到单个中介服务器,这将确保您的消息被广播到所有目的地。

您可以在Spring Tutorials找到这样的应用示例

使用 WebRTC 传输的无代理消息传递(实验性且未正式发布)

我们进行了一些实验,将 WebRTC(连同普通 WebSocket)传输带入浏览器通信。

请找到那些实验here。如果您认为需要,请在我们的问题跟踪器上尝试并分享您对这种运输支持的反馈/投票。

【讨论】:

  • 非常感谢,我认为这是我需要的解决方案。我一直在浏览代码,从你提到的内容来看,我确信它有。我只是不知道如何将它从 Kotlin 传输到 Java 以及关于 TypeScript 的一些东西。我非常感谢支持和所花费的时间,我努力去理解它。
猜你喜欢
  • 2019-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-12
  • 1970-01-01
相关资源
最近更新 更多