Как сервер Rsocket отправляет сообщение клиенту? А как использовать Channel в js?

все.

Вопрос 1

Пробую использовать Rsocket. Как сервер Rsocket отправляет сообщение клиенту? Как и websocket, сервер может отправлять сообщение одному или всем клиентам. Я не могу найти способ сделать это. Может я могу использовать канал? Но я не знаю, что мне делать.

вопрос 2

Я использую канал вот так:

  @MessageMapping("channel")
  fun channel(settings: Flux<Duration>) =
      settings
          .doOnNext { setting: Duration -> println("Frequency setting is ${setting.seconds} second(s).") }
          .switchMap { setting: Duration ->
            Flux.interval(setting).map { index: Long -> Message("Server", "Channel", index) }
          }
          .log()

А в js я делаю так:

const {
  RSocketClient
} = require('rsocket-core');
const RSocketTcpClient = require('rsocket-tcp-client').default;
const {Flowable} = require('rsocket-flowable')

const tcpClient = new RSocketTcpClient((host, port))

const client = new RSocketClient({
  setup: {
    keepAlive,
    lifetime,
    dataMimeType: "application/json",
    metadataMimeType: 'message/x.rsocket.routing.v0'
  },
  transport: tcpClient,
});

const flowablePayload = new Flowable(subscriber => {
  subscriber.onSubscribe({
    cancel: () => {},
    request: n => {
      for (let index = 0; index < n; index++) {
        const message = {
          message: "requestChannel from JavaScript! #" + index
        };
        subscriber.onNext(message);
      }
      subscriber.onComplete();
    }
  });
});    

client.connect().subscribe({
  onComplete: socket => {
    console.log('onComplete')
    socket.requestChannel({
      data: flowablePayload,
      metadata: String.fromCharCode('channel'.length) + 'channel'
    }).subscribe({
      onComplete: res => console.log(res),
      onError: err => console.error(err),
      onSubscribe: cancel => console.log('success')
    });
  },
  onError: error => {
    console.log("got error");
    console.error(error);
  },
  onSubscribe: cancel => {
    console.log("subscribe!");
  }
})

выход:

subscribe!
onComplete
success

Но я не могу получить MessageMapping информацию о канале и channel метод не выполняется.

Что я должен делать?

Спасибо!!!


person EchoCow    schedule 22.04.2020    source источник
comment
привет @EchoCow, я борюсь с той же проблемой, что и ты. Можем ли мы поговорить об этом, может быть, мы сможем во всем разобраться. chat.stackoverflow.com/rooms/212325/rsocket-with-spring-webflux   -  person kojot    schedule 23.04.2020


Ответы (1)


Вопрос 1. Если вы хотите узнать, как отправить сообщение определенному клиенту, см. Этот вопрос StackOverflow Отправлять сообщение только определенному клиенту, использующему веб-сокеты с Rsocket и Spring Webflux

Вопрос 2: Никогда не пробовал использовать каналы, но не уверен, что вам это действительно нужно. Я бы использовал канал, например, в онлайн-игре, где пользователь постоянно нажимает клавиши, а сервер должен на них отвечать.

person kojot    schedule 27.04.2020