首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当连接到通道响应本机客户端时,Rsocket-js无法设置目标路由。

当连接到通道响应本机客户端时,Rsocket-js无法设置目标路由。
EN

Stack Overflow用户
提问于 2022-10-12 18:33:11
回答 1查看 39关注 0票数 0

我是Rsocket和反应性Websocket的新手,我开发了一个应用程序,在那里我需要多个通道,我的客户可以在那里订阅。直到现在,我尝试了2种解决方案,但不幸的是,它们都不像我所期望的那样起作用。

  1. 我用Spring实现了一个反应性Websocket服务器,在这里我将每个客户端连接存储在一个FluxSink列表中,但不幸的是,有了这个解决方案,我无法实现通道,这就是我尝试RSocket的原因。我的第一个问题是可以用这个工作流实现通道吗?我是否正确地支持只有一个websocket连接应该在一个客户端和服务器之间打开?因为这就是我花这么多时间想办法创建频道的原因。
  2. 用我的拳头,我可以建立我的服务器和我的客户之间的连接,他们可以通信,但不幸的是,我可以创建通道。所以我尝试了RSocket,因为我读到这个协议很容易创建双向通道,但不幸的是我无法连接到它们。

我有一个具有@MessageMapping的控制器

代码语言:javascript
复制
@MessageMapping("my-channel")
public Flux<String> channel(final Flux<String> message) {
  log.info("Received stream-stream (channel) request... ");

  return message
        .doOnNext(m -> log.info("Request: ", m))
        .doOnCancel(() -> log.warn("Client cancelled the channel"))
        .switchMap(setting -> Flux.interval(Duration.ofSeconds(10)).map(index -> "Love spring if it works"))
        .log()
        ;
 }

当我试图连接到rsc客户端时,一切都很好。

代码语言:javascript
复制
./rsc --debug --channel --data=asd --route=my-channel --stacktrace ws://localhost:7000

但不幸的是,当我试图从我的反应本地客户端连接时,目标路由总是'‘。当然,如果我更改@MessageMapping(“me”) -> @MessageMapping(""),它会完美地工作,但是对于明显的目的,这个解决方案不适合我。

代码语言:javascript
复制
const connector = new RSocketConnector({
  setup: {
    keepAlive: 100,
    lifetime: 10000,
    metadataMimeType: "application/json",
    dataMimeType: "message/x.rsocket.routing.v0"
  },
  transport: new WebsocketClientTransport({
    url: "ws://192.168.0.107:7000",
    wsCreator: (url) => new WebSocket(url) as any,
  }),
});

const rsocket = await connector.connect();

await new Promise((resolve, reject) => {
  const requester = rsocket.requestChannel(
    {
      data: undefined,
      metadata: Buffer.concat([
        Buffer.from(String.fromCharCode('my-channel'.length)),
        Buffer.from('my-channel'),
      ]),
    },
    1,
    false,
    {
      onError: (e) => reject(e),
      onNext: (payload, isComplete) => {
        console.log(
          `payload[data: ${payload.data}; metadata: ${payload.metadata}]|${isComplete}`
        );

        requester.request(1);

        if (isComplete) {
          resolve(payload);
        }
      },
      onComplete: () => {
        resolve(null);
      },
      onExtension: () => { },
      request: (n) => {
        console.log(`request(${n})`);
        requester.onNext(
          {
            data: Buffer.from("Message"),
          },
          true
        );
      },
      cancel: () => { },
    }
  );
}).catch(e => {
  console.log("-------------ERRORRRRRR-------------")
  console.error(e);
});

错误消息如下:

代码语言:javascript
复制
-------------ERRORRRRRR-------------
ERROR  [Error: Destination '' does not support REQUEST_CHANNEL. Supported interaction(s): [METADATA_PUSH, SETUP]]

我做错了什么?

最后一个问题是如何在建立连接时发送额外的标题?

谢谢你提前提供帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-13 21:25:55

借助OlegDokuka在这个讨论中的帮助,我可以管理这个问题。唯一的问题就像他提到的那样。

实际:

代码语言:javascript
复制
metadataMimeType: "application/json",
dataMimeType: "message/x.rsocket.routing.v0"

必须是

代码语言:javascript
复制
dataMimeType: "application/json",
metadataMimeType: "message/x.rsocket.routing.v0"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74046533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档