一 介绍
HTTP(超文本传输协议)是一种无状态请求-响应协议。它的简单设计使得它非常具有可伸缩性,但是对于高度交互式的实时web应用程序来说是不合适和低效的,因为每个请求/响应都需要传输大量的开销。
由于HTTP是同步的,实时应用程序需要是异步的,所以任何解决方案(如轮询或长轮询(Comet))都会变得复杂和低效。
为了解决上述问题,我们需要一个基于标准的双向全双工协议,它可以同时用于服务器和客户端,这导致了JSR 356 API的引入-在本文中,我们将展示它的一个使用示例。
2 安装程序
让我们将Spring WebSocket依赖项包括到我们的项目中:
<
dependency
>
<
groupId
>org.springframework</
groupId
>
<
artifactId
>spring-websocket</
artifactId
>
<
version
>5.2.2.RELEASE</
version
>
</
dependency
>
<
dependency
>
<
groupId
>org.springframework</
groupId
>
<
artifactId
>spring-messaging</
artifactId
>
<
version
>5.2.2.RELEASE</
version
>
</
dependency
>
我们总是可以从Maven Central获得spring websocket和spring消息传递的最新版本的依赖项。
三 STOMP
面向流文本的消息传递协议(Stream Text-Oriented Messaging Protocol,STOMP)是一种简单的、可互操作的有线格式,它允许客户端和服务器与几乎所有的消息代理进行通信。它是AMQP(高级消息队列协议)和JMS(Java消息服务)的替代方案。
STOMP为客户机/服务器定义了一个使用消息语义进行通信的协议。语义位于WebSockets之上,定义映射到WebSockets框架的框架。
使用STOMP可以灵活地使用不同的编程语言开发客户机和服务器。在本例中,我们将使用STOMP在客户机和服务器之间传递消息。
四 WebSocket服务器
在本文中,您可以阅读有关构建WebSocket服务器的更多信息。
五 WebSocket客户端
要与WebSocket服务器通信,客户端必须通过向正确设置了升级头的服务器发送HTTP请求来启动WebSocket连接:
GET ws://websocket.example.com/ HTTP/1.1
Origin: http://example.com
Connection: Upgrade
Host: websocket.example.com
Upgrade: websocket
请注意,websocketurl使用ws和wss方案,第二个表示安全WebSockets。
如果启用了WebSockets支持,则服务器通过在响应中发送升级头进行响应。
HTTP/1.1 101 WebSocket Protocol Handshake
Date: Wed, 16 Oct 2013 10:07:34 GMT
Connection: Upgrade
Upgrade: WebSocket
一旦这个过程(也称为WebSocket握手)完成,初始的HTTP连接将被WebSocket连接替换为同一TCP/IP连接之上的WebSocket连接,之后任何一方都可以共享数据。
此客户端连接由WebSocketStompClient实例启动。
5.1 WebSocketStompClient
如第3节所述,我们首先需要建立一个WebSocket连接,这是使用WebSocketClient类完成的。
可以使用以下方法配置WebSocketClient:
由任何JSR-356实现(如Tyrus)提供的标准websocketclient
Jetty 9提供的JettyWebSocket客户端+本机WebSocket API
Spring的WebSocketClient的任何实现
我们将使用标准WebSocketClient,在我们的示例中是WebSocketClient的一个实现:
WebSocketClient client =
new
StandardWebSocketClient();
WebSocketStompClient stompClient =
new
WebSocketStompClient(client);
stompClient.setMessageConverter(
new
MappingJackson2MessageConverter());
StompSessionHandler sessionHandler =
new
MyStompSessionHandler();
stompClient.connect(URL, sessionHandler);
new
Scanner(System.in).nextLine();
// Don't close immediately.
默认情况下,WebSocketStompClient支持SimpleMessageConverter。由于我们处理的是JSON消息,所以我们将消息转换器设置为MappingJackson2MessageConverter,以便将JSON负载转换为对象。
在连接到端点时,我们传递StompSessionHandler的实例,该实例处理afterConnected和handleFrame等事件。
如果我们的服务器支持SockJs,那么我们可以修改客户端以使用SockJs client而不是标准的websocketclient。
5.2 StompSessionHandler
我们可以使用StompSession订阅WebSocket主题。这可以通过创建StompSessionHandlerAdapter实例来完成,该实例反过来实现StompSessionHandler。
StompSessionHandler为STOMP会话提供生命周期事件。事件包括会话建立时的回调和失败时的通知。
一旦WebSocket客户端连接到端点,就会通知StompSessionHandler并调用afterConnected()方法,在这里我们使用StompSession订阅主题:
@Override
public
void
afterConnected(
StompSession session, StompHeaders connectedHeaders) {
session.subscribe(
"/topic/messages"
,
this
);
session.send(
"/app/chat"
, getSampleMessage());
}
@Override
public
void
handleFrame(StompHeaders headers, Object payload) {
Message msg = (Message) payload;
logger.info(
"Received : "
+ msg.getText()+
" from : "
+ msg.getFrom());
}
确保WebSocket服务器正在运行,并且正在运行客户端,消息将显示在控制台上:
INFO o.b.w.client.MyStompSessionHandler - New session established : 53b993eb-7ad6-4470-dd80-c4cfdab7f2ba
INFO o.b.w.client.MyStompSessionHandler - Subscribed to /topic/messages
INFO o.b.w.client.MyStompSessionHandler - Message sent to websocket server
INFO o.b.w.client.MyStompSessionHandler - Received : Howdy!! from : Nicky
六 结论
在这个快速教程中,我们实现了一个基于Spring的WebSocket客户端。
完整的实现可以在GitHub上找到。
原文:https://www.baeldung.com/websockets-api-java-spring-client
本文:
讨论:请加入知识星球或者微信圈子【首席架构师圈】
- 登录 发表评论
- 37 次浏览
最新内容
- 4 days 23 hours ago
- 6 days 21 hours ago
- 1 week ago
- 1 week 1 day ago
- 1 week 1 day ago
- 1 week 1 day ago
- 1 week 2 days ago
- 1 week 2 days ago
- 1 week 2 days ago
- 1 week 2 days ago