angular - 如何使用 Angular 9 收听 Quarkus Websocket?
问题描述
正如问题所暗示的那样,我想构建一个服务,使用Websocket
. 但我很新websockets
,所以我需要你的帮助。
我使用以下版本:
前端: 角度:9.1.0
后端: Quarkus:1.3.2.Final + Quarkus-undertow-websockets
我在 Angular 服务中有以下代码:
import {Injectable} from '@angular/core';
@Injectable({
providedIn: 'root',
})
export class SocketService {
private ws: any;
constructor() {
}
public connect(): void {
this.ws = new WebSocket('ws://localhost:8080/sync/breit');
this.ws.onmessage = (msg) => {
console.log(msg);
};
}
public sendData(data: any): void {
this.ws.send('/' + name, {}, 'Testmessage');
}
}
当按下按钮时ngOninit()
,函数 connect 被调用。sendData()
现在,这是后端代码:
package io.sync.websocket;
import org.jboss.logging.Logger;
import javax.enterprise.context.ApplicationScoped;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@ServerEndpoint("/sync/{username}")
@ApplicationScoped
public class SyncSocket {
private static final Logger LOG = Logger.getLogger(SyncSocket.class);
Map<String, Session> sessions = new ConcurrentHashMap<>();
@OnOpen
public void onOpen(Session session, @PathParam("username") String username) {
sessions.put(username, session);
}
@OnClose
public void onClose(Session session, @PathParam("username") String username) {
sessions.remove(username);
}
@OnError
public void onError(Session session, @PathParam("username") String username, Throwable throwable) {
sessions.remove(username);
LOG.error("onError", throwable);
}
@OnMessage
public void onMessage(String message, @PathParam("username") String username) {
System.out.println("Message came through");
broadcast(message);
}
private void broadcast(String message) {
sessions.values().forEach(s -> {
s.getAsyncRemote().sendObject(message, result -> {
if (result.getException() != null) {
System.out.println("Unable to send message: " + result.getException());
}
});
});
}
}
我有来自 Quarkus Websocket 教程的代码。只是稍微修改了一下。
现在,当我点击调用服务中的函数的发送按钮时sendData()
,我希望收到Testmessage
,但我只是得到/
:
网络控制台中的输出:
我不知道如何向 Quarkus 添加额外的“侦听器”URL,我可以定义 ServerEndpoint。在 Spring Boot 中,它将是@SendTo('URL_COMES_HERE')
注释。Quarkus 中是否存在类似的东西?
解决方案
请检查您的 sendData 方法。我认为数据的行为是“/”是意料之中的。“名”从何而来?此时它似乎只是一个空字符串。另外,关于“Testmessage”:如果你查看Websocket.send方法,你会发现该方法只有一个参数;所以“Testmessage”参数将被忽略。
推荐阅读
- jaeger - 分布式跟踪跨越 Node.js 和 Java 服务时出现 Jaeger 代理错误
- reactjs - ReactJs:我如何渲染二进制(base64)图像格式
- python - 在 Python 代码中使用 Mysql aes_encrypt() 和 aes_decrypt() 函数
- python-3.x - 识别语料库中每个文档唯一的单词的更好方法
- angular - 如何使用 rxjs 运算符获取最近的值
- git - Git 源代码控制安全性如何工作?
- django - 如何将图像(任何文件)从 VueJs 前端传递到 Django Rest Framework API?
- imagemagick - 为什么 Imagemagick 的形态膨胀算法与数学定义不同?
- angular - 如何在 Angular 中实现 CKEditor5 并将图像上传到 ASP.NET Core Web API?
- angular-material - 未设置默认排序角垫表箭头