- как отправить сообщение всем пользователям чата если отправить?
- как передать сообщение о событии в пользовательском интерфейсе, если, например, кто-то ввел текст в текстовую область и нажал отправить (грубо говоря, как преобразовать событие чьего-либо ввода в сообщение и его передачи)?
Я бы хотел использовать канальную модель.
Сервер:
@Controller
public class SetUpController {
@ConnectMapping("chat")
public Mono handleSetUp(RSocketRequester requester, @Payload String token) {
ControllerUtils.tokenRSocketRequesterMap.put(token, requester);
return Mono.empty();
}
}
@Controller
public class ChatController {
protected JwtService jwtService;
@ConnectMapping("chat")
public Mono sendMessageForAll(Mono message) {
message.doOnNext(m -> ControllerUtils.tokenRSocketRequesterMap
.values()
.forEach(requester -> requester
.route("chat")
.data(message, Message.class)
.send()));
return Mono.empty();
}
}
Клиент:
const {
RSocketClient,
JsonSerializer,
IdentitySerializer,
encodeRoute
} = require('rsocket-core');
const RSocketWebSocketClient = require('rsocket-websocket-client').default;
const WebSocket = require('ws');
function connect() {
return 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: 'ws://localhost:8080/tweetsocket',
wsCreator: (url) => {
return new WebSocket(url)
}
}),
})
.connect();
}
const client = connect()
client.subscribe({
onComplete: socket => {
socket.requestChannel({
data: Buffer(JSON.stringify(createAndSendMessage())),
metadata: encodeRoute('chat')
}).subscribe({
onComplete: () => console.log('complete'),
onError: error => {
console.log(error);
},
onNext: payload => {
createAndDrawMessage()
},
onSubscribe: subscription => {
subscription.request(2147483647);
},
});
},
onError: error => {
console.log(error);
},
onSubscribe: cancel => { }
});
class Message {
sender
text
date
constructor(sender, text, date) {
this.sender = username
this.text = password
this.date = date
}
}
Подробнее здесь: https://stackoverflow.com/questions/786 ... th-rsocket