SockJS简单介绍

一、定义

SockJS是一个浏览器JavaScript库,它提供了一个类似于网络的对象。SockJS提供了一个连贯的、跨浏览器的Javascript API,它在浏览器和web服务器之间创建了一个低延迟、全双工、跨域通信通道。

二、产生的原因

一些浏览器中缺少对WebSocket的支持,因此,回退选项是必要的,而Spring框架提供了基于SockJS协议的透明的回退选项。

SockJS的一大好处在于提供了浏览器兼容性。优先使用原生WebSocket,如果在不支持websocket的浏览器中,会自动降为轮询的方式。
除此之外,spring也对socketJS提供了支持。

如果代码中添加了withSockJS()如下,服务器也会自动降级为轮询。

registry.addEndpoint("/coordination").withSockJS();

SockJS的目标是让应用程序使用WebSocket API,但在运行时需要在必要时返回到非WebSocket替代,即无需更改应用程序代码。

SockJS是为在浏览器中使用而设计的。它使用各种各样的技术支持广泛的浏览器版本。对于SockJS传输类型和浏览器的完整列表,可以看到SockJS客户端页面。
传输分为3类:WebSocket、HTTP流和HTTP长轮询(按优秀选择的顺序分为3类)

三、使用

  • SockJS 很容易通过 Java 配置启用
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(myHandler(), "/myHandler").withSockJS();
    }

    @Bean
    public WebSocketHandler myHandler() {
        return new MyHandler();
    }

}

与之等价的XML配置:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:websocket="http://www.springframework.org/schema/websocket"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/websocket
        http://www.springframework.org/schema/websocket/spring-websocket.xsd">

    <websocket:handlers>
        <websocket:mapping path="/myHandler" handler="myHandler"/>
        <websocket:sockjs/>
    </websocket:handlers>

    <bean id="myHandler" class="org.springframework.samples.MyHandler"/>

</beans>
  • 打开一个连接,为连接创建事件监听器,断开连接,消息时间,发送消息返回到服务器,关闭连接。
<script src="//cdn.jsdelivr.net/sockjs/1.0.0/sockjs.min.js"></script>

var sock = new SockJS('/coordination');  
sock.onopen = function() {
    console.log('open');
};
sock.onmessage = function(e) {
    console.log('message', e.data);
};
sock.onclose = function() {
    console.log('close');
};
sock.send('test');
sock.close();

四、心跳消息

SockJS协议要求服务器发送心跳消息,以阻止代理结束连接。Spring SockJS配置有一个名为“心脏节拍时间”的属性,可用于定制频率。默认情况下,如果没有在该连接上发送其他消息,则会在25秒后发送心跳。

当在websocket/SockJS中使用STOMP时,如果客户端和服务器通过协商来交换心跳,那么SockJS的心跳就会被禁用。

Spring SockJS支持还允许配置task调度程序来调度心跳任务。

五、Servlet 3异步请求

HTTP流和HTTP长轮询SockJS传输需要一个连接保持比平常更长时间的连接。
在Servlet容器中,这是通过Servlet 3的异步支持完成的,这允许退出Servlet的容器线程处理一个请求,并继续从另一个线程中写入响应。

六、SockJS的CROS Headers

如果允许跨源请求,那么SockJS协议使用CORS在XHR流和轮询传输中跨域支持。

  • 4
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
SockJS API 是一个 JavaScript 库,用于在客户端和服务器之间建立实时双向通信。它提供了一组简单易用的接口,以便开发者能够在浏览器中创建SockJS连接,发送和接收消息。 SockJS API 是为了克服WebSocket在某些浏览器中的兼容性问题而创建的。它使用类似于WebSocket的技术,但在不支持WebSocket的浏览器中,SockJS会降级到使用长轮询、XHR Streaming和IFrame等技术来实现实时通信。 使用SockJS API非常简单。首先,我们需要在客户端引入SockJS库,然后创建一个SockJS连接对象。通过传入服务器的URL,我们可以与服务器建立连接。一旦连接建立,我们就可以注册事件监听器来处理不同的SockJS事件,比如连接建立、连接断开、消息接收等。我们可以使用send()方法向服务器发送消息,使用close()方法关闭连接。 SockJS可以与不同的服务器端实现集成,比如Java、Node.js等。服务器端需要提供一个SockJS服务,用于处理和管理与客户端的连接。服务器端实现需要根据SockJS协议来处理不同的请求和响应。 SockJS API的优点是它提供了一种统一的接口,无论是WebSocket还是其他长轮询技术,开发者可以使用相同的API来实现实时通信。它也解决了WebSocket在某些浏览器中的兼容性问题,使得开发者可以更方便地使用实时通信功能。 总之,SockJS API是一个用于在客户端和服务器之间建立实时双向通信的JavaScript库。它提供了一组简单易用的接口,使得开发者可以方便地实现实时通信功能。无论是WebSocket还是其他支持的技术,SockJS都能提供统一的接口来实现跨浏览器的实时通信。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值