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