BS结构下可否利用什么是websockett来实现文件的点对点传输

本文章向大家介绍springboot集成什么是websockett实現服务端推送主要包括springboot集成什么是websockett实现服务端推送使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值需要嘚朋友可以参考一下。

}

运用SockJsClient模拟大规模用户并发需要做洳下HTTP客户端相关配置来支持足够数量的连接和线程Jetty的例子:

也可以考虑自定义这些服务器端SockJS相关的属性(请参阅Javadoc获得相关详细信息):

什么是websockett协议定义了两种消息类型——text和binary——但是没明确其具体的内容。反而计划让客户端和服务端利用达成一致的子协议即定义了消息內容的高层协议。运用子协议是可选的但至少客户端和服务端需要知道双方如何互相解析消息

STOMP最初作为(Ruby,Python和Perl等)脚本语言的一个简单消息传输协议来连接企业消息代理。它是为了解决常用模式消息传递协议的一个子集STOMP可以在TCP和什么是websockett等任何可靠的双向流的网络协议中应鼡。

STOMP协议的基础框架仿效HTTP下面是框架构成:

例如,客户端可以用SEND命令来发送消息或用SUBSCRIBE命令根据兴趣订阅消息两种命令都需要指明"destination"头部信息来指明消息的去向,同样指明订阅的指向

下面是一个示例客户机发送请求购买股票:

这是客户端订阅接收股票报价的一个例子:

STOMP的规范Φ没有明确定义destination的含义。可以是任何字符串完全取决于STOMP服务提供的定义的语义和语法的目的。然而通常像"/topic/.."这样指定的路径意味着发布訂阅(一对多),像"/queue/"这样指定的路径意味着点对点(一对一)消息交互

STOMP服务可以执行MESSAGE命令向所有订阅者发送广播。下面是一个股票报价垺务器端给一个订阅客户端发送订阅的例子:

要知道服务器是不能发送未经请求的消息的服务端相应的所有的消息必须针对特定的客户端并且服务端消息的头信息中的"subscription-id"必须和客户端头信息中的"id"一致。

上面概述的目的是提供对STOMP协议最基本的了解建议参考,很容易遵循和控制。

  • 提供常见的消息传递模式的应用层级协议

  • 在客户端和服务器端翻译路由,处理消息方面的能力

  • 可供选择的消息代理——RabbitMQ, ActiveMQ等消息中间件——广播消息(稍后讲解)

和一般的什么是websockett相比STOMP最明显的好处是Spring框架提供了应用层的开发模板同时Spring MVC也提供了基于HTTP的开发模板

在浏览器端,客户端连接可能会用到如下和:

需要注意的是上边提到的stompClient不需要在头部指明登陆和密码即使指明了也会被服务端忽略或覆盖。参考21.4.8节“连接到功能全面的代理”和21.4.10节,“身份验证”获得更多相关信息

当STOMP端点配置好,Spring应用充当STOMP代理给客户端提供连接控制传入的消息並反馈消息。这节将通过一个大图描述消息流如何在应用内部运转

spring-messaging模块包含起源于的大量的抽象,目的是为了构建消息应用的模块:

  • ——存在消息头和有效负载的消息

  • ——一份处理消息的合约。

  • ——在发送方和接收方之间发送消息的松散耦合的合约

  • ——SubscribableChannel的一个可以通過线程池实现异步消息的具体实现。

什么是websockett上提供的STOMP的Java和XML配置消息流使用上述组装一个具体应用包括以下三种渠道:

  • "brokerChannel"——应用内部的消息代理。每条从应用到代理的消息通过这条通道

"clientInboundChannel"里的消息能流向指定的应用程序的处理方法(例如一个股票交易执行请求)或可以转发給代理(例如客户端订阅股票报价)。STOMP目的地是用于简单prefix-based路由例如以"/app"前缀的能路由到指定的方法,以"/topic"和"/queue"前缀的能路由到服务代理

当一個处理消息的带注解的方法存在返回值时,它的返回值作为Spring的消息的有效负载发送到"brokerChannel"代理将消息广播给客户。在消息模板的帮助下应鼡程序的任何地方都可以向目标发送消息。例如一个HTTP POST处理方法可以向连接的客户端发送广播或服务组件可以定期的广播股票报价

下面是┅个简单的例子来说明了信息的流动:

下面是上边信息流示例的解释:

下一节将详细介绍注解的方法和它的参数及返回值。

@MessageMapping注解用在被@Controller注解嘚类的方法上@MessageMapping可以用来方法上映射消息目标,也可以用在类级别上共享给控制器中所有的方法

应用中同样可以用圆点分隔的目标(相對于用斜线分隔的)。参考21.4.9节“用点分隔@MessageMapping注解中的目标”。

  • Message方法参数可以使用正在处理中的完整的消息

  • @Headers注解的方法参数必须也能转换荿java.util.Map类型来访问所有消息的头部信息。

  • MessageHeaders方法参数用来访问所有头部信息的map集合

  • @DestinationVariable注解的参数访问消息目标中提到模板变量。如果需要它的值將被转化成声明的参数的类型

@SubscribeMapping注解也能映射订阅请求到@Controller注解的类的方法。它是方法级的但是也能和类级别的@MessageMapping注解结合使用共享给控制器中所有的处理消息的方法。

默认情况@SubscribeMapping注解的方法返回值作为一个消息直接发送回连接的客户端而不通过代理这是请求-应答消息交互很鈈错的实现;例如,当应用程序的UI正在初始化时获取应用程序的数据另外可以用@SendTo注解@SubscribeMapping注解的方法来将返回的消息通过指定的目标地址发送到"brokerChannel"。

如果你想给应用程序中的任何连接着的客户端发送消息如何做?任何应用程序组件都能向"brokerChannel"发送消息最简单的方法是注入SimpMessagingTemplate,用它來发送消息通常它是很容易的类型注入,如:

如果已经有其相同类型的注入存在同样可以将它声明成"brokerMessagingTemplate"。

客户端自带的处理订阅请求的簡单的消息代理是把信息存储在内存中并向匹配的连接着的客户端广播消息这种代理支持路径式的目标,包括Ant-style模式目标的订阅

应用中哃样可以用圆点分隔的目标(相对于用斜线分隔的)。参考21.4.9节“用点分隔@MessageMapping注解中的目标”。

21.4.7功能全面的代理

简单的代理是个伟大的开始泹是只支持STOMP命令的一小部分(如没有延迟收据等),依赖一个简单的发送消息的回路,不适用于集群应用程序可以升级成一个功能全面的消息代理替代它。

查看STOMP文档选择适合你的消息代理(RabbitMQActiveMQ等),启动STOMP支持安装和运行它然后把启动STOMP代理的操作配到Spring的配置中。

下面是配置启鼡功能全面的代理的示例:

上边配置中的STOMP代理适配器是个Spring 把消息转发给外部的消息代理。这样将建立TCP和代理间的连接将所有消息转发給TCP,相反的从代理接收的所有信息通过它们之间的会话传给客户端本质上它作为一个适配器双向转发消息。

此外应用程序组件(例如HTTP請求处理方法,业务服务等)也可以发送消息给代理适配器正如21.4.5节,“消息发送”中描述的那样将广播消息发送给订阅的什么是websockett客户端。

事实上代理适配器能提供健壮和可伸缩的消息广播。

21.4.8连接功能全面的代理

STOMP代理适配器维持一个系统TCP和代理间的连接这个连接仅用於来自应用服务端产生的消息,不是用来接受消息的你可以给这个连接配置STOMP证书,即STOMP帧的登录和密码头它们是暴漏在Java配置和XML配置中的默认值为guest/guest的systemLogin/systemPasscode属性。

STOMP代理适配器为每个客户端委托的转发代理的连接设置登录和密码头因此什么是websockett客户端不需要设置这些也不用理会。以丅部分解释说相反什么是websockett客户应该依靠HTTP身份验证来保护什么是websockett端点和建立客户身份

STOMP代理适配器也向系统TCP连接上的消息代理发送和接收心跳信息。可以配置发送和接收心跳的间隔(默认为10秒)如果到代理的连接失效,代理适配器将每隔5秒尝试重连直到成功建立连接

当到玳理的系统连接失效又重新建立时可以通过实现ApplicationListener的Spring实体来接收相关通知。例如一个股票报价广播服务可以在没有活跃的“系统”连接时停圵发送消息

STOMP代理适配器也可以配置虚拟主机属性。这个属性的值将设置为每一个连接帧的主机头这将对在云中确定真正指向的主机很囿帮助,建立TCP连接不同于主机提供的云STOMP服务

尽管"/"分隔路径模式为开发者熟知,在消息传递中通常也会用到"."来分隔例如在主题,队列茭流等的命名中。应用程序中也可以通过配置一个自定义的AntPathMatcher从而用"."替代"/"作为@MessageMapping映射的分隔器

如下是个控制器中用"."分隔的小例子:

什么是websockett类型应用程序很容易知道消息发送方。因此需要建立将用户身份和当前会话绑定的身份认证

现存的Web应用程序已经用了基于HTTP的身份认证。如Spring Security鈳以保护应用程序中的基于HTTP的URLs自从基于HTTP的握手作为什么是websockett会话的开始,STOMP/什么是websockett的URLs自然而然的需要身份认证和受到保护此外在真正握手湔页面打开的连接本身就是受保护的,用户应该通过身份验证

有些时候这对给什么是websockett会话分配身份很有用尤其是当用户还没有获得正式嘚身份认证时。例如一个移动端应用可能给分配一些或许具有地理位置的匿名用户可以在应用程序中继承DefaultHandshakeHandler重写determineUser方法。可以加入自定义的握手处理(参考21.2.4节“部署注意事项”)。

在消息发送方如发送到"/user/{username}/queue/position-updates"的消息的地址将被UserDestinationMessageHandler依次转换成一到多个跟用户相关的会话。这使应用程序内置组件向只有特定的名称和通用目的地址的用户发送消息成为可能同消息模板,这也支持注解方式

例如消息处理方法可以向被@sendToUser紸解的信息相关的用户发送消息:

如果用户存在多个会话,默认所有会话给定的地址都要被标记但是有时候,只需要标记正在处理的消息的会话可以通过设置broadcast属性为false做到,如:

用户目标地址通常意味着一个验证的用户没有严格这样要求。一个什么是websockett会话能不能订阅用戶目标跟用户是否经过身份验证无关这种情况下@SendToUser注解中加不加broadcast=false都一样,例如针对唯一会话发送处理的消息。

当用到外部消息代理的用戶目标时检查代理的文档获得的如何管理非活动的队列帮助,这样当用户的会话结束时所有的用户队列将会被移除例如,当RabbitMQ开启如/exchange/amq.direct/position-updates的目标时会创建自动清除的队列所有那种情况下客户端将订阅到/user/exchange/amq.direct/position-updates。ActiveMQ有清除非活动目标的配置项可供使用

21.4.12应用程序环境中的事件和消息拦截的监听

一些发布的应用程序环境中的事件(列表如下)可以通过实现ApplicationListener接口的监听捕获。

}

我要回帖

更多关于 什么是websocket 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信