- 如何将websocket消息从服务器发送到特定用户?**
我的网络应用程序有spring安全设置,并使用websocket。我遇到了棘手的问题,试图发送消息从服务器到特定用户只。
我从阅读手册的理解是从服务器我们可以做
simpMessagingTemplate.convertAndSend("/user/{username}/reply", reply);
在客户端:
stompClient.subscribe('/user/reply', handler);
但是我从来没有得到订阅回调调用。我已经尝试了许多不同的路径,但没有运气。
如果我将它发送到**/topic/reply**,它会工作,但所有其他连接的用户也会收到它。
为了说明这个问题,我在github上创建了这个小项目:https://github.com/gerrytan/wsproblem
- 复制步骤:**
1)克隆并构建项目(确保您使用的是jdk1.7和maven3.1)
$ git clone https://github.com/gerrytan/wsproblem.git
$ cd wsproblem
$ mvn jetty:run
2)导航到http://localhost:8080
,使用bob/test或jim/test登录
3)单击"请求用户特定消息"。预期:消息"hello {username}"显示在仅针对此用户的"仅接收给我的消息"旁边,实际:未收到任何内容
6条答案
按热度按时间ttvkxqim1#
哦,
client side no need to known about current user
,服务器会帮你做的。在服务器端,使用以下方式向用户发送消息:
queue
,而不是topic
,Spring始终将queue
与sendToUser
一起使用**在客户端
当任何一个websocket连接打开时,Spring会给它分配一个
session id
(不是HttpSession
,每个连接分配一个)。当你的客户端订阅一个频道时,以/user/
开始,例如:/user/queue/reply
,则服务器示例将订阅名为queue/reply-user[session id]
的队列使用时向用户发送消息,例如:用户名为
admin
您将写入simpMessagingTemplate.convertAndSendToUser("admin", "/queue/reply", message);
Spring将确定哪个
session id
Map到用户admin
。例如:它发现了两个会话wsxedc123
和thnujm456
,Spring会将其转换为两个目的地queue/reply-userwsxedc123
和queue/reply-userthnujm456
,并将带有两个目的地的消息发送到消息代理。消息代理接收消息并将其提供回您的服务器示例,该示例持有与每个会话对应的会话(WebSocket会话可以由一个或多个服务器持有). Spring会将消息转换为
destination
(例如:user/queue/reply
)和session id
(例如:wsxedc123
),然后将消息发送到对应的Websocket session
zqdjd7g92#
啊,我发现我的问题是什么了,首先我没有在简单代理上注册
/user
前缀那么发送时就不需要额外的
/user
前缀了:Spring会自动将
"/user/" + principal.getName()
添加到目的地,因此它解析为“/user/bob/reply”。这也意味着在javascript中我必须为每个用户订阅不同的地址
uemypmqf3#
我也使用STOMP创建了一个示例WebSocket项目。
无论“/user”是否包含在config中,它都有效。
3ks5zfa04#
我的解决方案基于Thanh Nguyen货车的最佳解释,但除此之外,我还配置了MessageBrokerRegistry:
u0njafvf5#
完全一样,我做了同样的,它是工作,而不使用用户
ulmd4ohb6#
在下面的解决方案中,我为客户端和后端编写了代码片段。我们需要将
/user
放在客户端代码套接字主题的开头。否则,客户端无法侦听套接字。依赖性网络套接字配置.java
网络套接字控制器.java
你可以从任何地方向socket发送消息,在我的例子中,我的principal.getName()等于userId。
**客户端(带有react-stomp的Reactjs)**应用js
SockJsClient元素的url属性是
http://localhost:9090/notification-service/socket
。http://localhost:9090
是API网关IP地址,notification-service
是微服务的名称,/socket
在WebSocketConfig.java中定义。