Springboot整合websocket

引入javax.websocket.api得到运用websocket,为什么要Springboot要整合websocket?在websocket运行于外部Tomcat时,当一对servlet访问,就产生了一个websocket实例,两两相对通讯,一个客户端一个服务端。经过这个发现,导致后面的代码要改,比如容器不能在这里面要么是静态!因为这是产生多例

 

在运行于外部Tomcat,一个访问一个实例服务,运行在Springboot内嵌Tomcat则不是这样了,访问不上,因为注册不进去。指的不上注入到Spring容器中,而是websocket服务注册不进去通过以前的方法。实例对象注解能注入,到websocket服务注册不到Tomcat容器中。就访问不上了,所以有整合一说,使用Springboot按约定进行整合开发。因为有依赖所以要整合,websocket依赖于web容器,而Springboot自己嵌容器,所以要进去就只有整合。如果无依赖Spring则注入与否都一样

 

jsp代码和之前的一样,通过url长时间连接服务器,进行通讯。页面代码:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script>
        var websocket;
        if ('WebSocket' in window) {
            websocket = new WebSocket("ws://localhost:8080/websocket/zhangsan");
        } else {
            console.log("不支持websocket");
        }
        window.onbeforeunload = function (ev) {
            console.log("准备关闭连接")
            websocket.close();
        }
        websocket.onmessage = function (ev) {
            console.log("收到服务器消息: " + ev.data)
        }
        websocket.onerror = function (ev) {
            console.log("出现异常")
        }
        websocket.onopen = function (ev) {
            console.log("连接建立成功")
        }
    </script>
</head>
<body>
<input type="text" name="">
<button id="clickEndpoint">发送消息</button>
</body>

<script>
    var v = document.getElementById("clickEndpoint");
    v.onclick = function (msg) {
        websocket.send("xixihaha");
    }
</script>

</html>

判断是否支持websocket,加载script时通过ws://url连接服务器,给window注册时间,点击按钮websocket对象.send发出信息

 

 

服务端:

@Configuration表示自己是个配置类,@EnableWebSocket将websocket的bean都管理进来。实现与websocketConfigurer接口。将重写方法registerWebSocketHandler是:注册websocket处理者。前面是处理者类,后面是websocket的服务名。

 

给注册处理类添加拦截器,这样将在进行websocket经过拦截器,当然拦截器可要可不要。如果有需求到可要要,我们这里为了拿到一点信息使用了拦截器

 

拦截器:

实现拦截器接口,将重写2方法,拦截前与拦截后方法,。从请求头获得url,得到/zhangsan,截取掉/,拿到参数的map,将截取的名字放进去,后面可要拿到这个map在websocket处理类中拦截器返回true表示继续往下调用,否则将原地停止

 

实现处理类,里面的方法与websocket类似,建立连接,存储在容器中。接收到消息调用Message方法,并得到websocketsession对象发送消息。这里是自己给自己发,也不打算去找谁去发送

 

发送异常以连接管理。都在重写方法内

 

通讯成功

 

使用websocket连接是建立了,但用户一刷新又是新连接这样也不合适,于是给用户打标识。关于如何调用到注解下的方法,工程收到别人的管理,他得到类的构造扫描类下的所有注解,符合就调用。如果他想在类的前与后做操作就产生代理。这两点做法是不一样的。一个是构造得到类的注解调用这些方法,一个是给类代理在类调用前后触发inkove不知不觉进行前与后操作

 

关于拦截器与过滤器,过滤器是符合过滤要求进入过滤器,可以选择往下调用,当掉完在回调到方法调用处。而拦截器是给类产生代理。在类的前后前后调用操作,调不调用你要掉的方法是随便

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章