跳转到主要内容

热门内容

今日:


总体:


最近浏览:


Chinese, Simplified

一 介绍

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

本文:

讨论:请加入知识星球或者微信圈子【首席架构师圈】

最后修改
星期四, 一月 5, 2023 - 21:56
Tags
 
Article