websocket能干啥?让客户端与服务器保持长连接,在连接过程中双方可相互通讯。就有如视图serversocket建立tcp通讯一样。websocket让双方保持长连接的相互通讯。平常是,请求服务器,服务器响应数据。现在可以双方进行长连接通讯了
引入websocket的实现,javax.websocket.api:获得引入其他jar,比如Tomcat-websocket通过其他jar对javax.websocket.api依赖,来引入websocket依赖。总之将依赖jar放进来
前端JS部分:
<script>
var websocket;
if ('WebSocket' in window) {
websocket = new WebSocket("ws://localhost:8080/webSocketServer/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>
判断window对象是否支持websocket,判断浏览是否支持。
如果之处,使用websocket的url对服务器发起请求,ws://ip:port/uri/paramter。协议以ws开头,服务器的地址,服务器的接收者,带给服务器的参数。使用这个url去连接服务器。
onOpen,当与服务器建立连接时触发
onError,当发生异常时触发
onMessage ,当收到服务器的消息时触发
onbeforeunload ,浏览器要关闭前触发
加载到script时,就去判断支不支持websocket,支持就去实例化websocket对象,构造器传websocket地址,此时就可以在构造对象时去连接websocket服务器了。然后给window注册websocket的事件事件。
写个输入框与按钮,注册事件。点击时触发事件,websocket.send()给服务器发送信息。填写内容,点击按钮,触发事件。使用websocket的send发出消息。在之前就与服务器建立长连接,现在就可以进行发送了
websocket服务器:
这注解都在是javax包下的websocket包下。@ServerEndpoint给websocket定义服务器,当访问这个uri就是请求这个服务了。后面是参数,参数只是一个标识,有需要就带,没需要就不需要,{name}使用{}包裹参数,当请求时,请求uri:websocketServer/后面就是参数了
这里集合是存储对象,session是当客户端与服务器建立连接时,将产生这样一个会话对象。这个对象就是服务器与客户端的联系纽带。name只是个表示,根据实际情况而定。这里面封装对象还是干什么,都根据实际情况
@OnOpen,当与客户端打开建立连接时,触发。写上这个注解,建立连接就会调用这个方法。@PathParam这个是从路径上分割出uri后面的参数。如果没有这个注解,就是报错。因为这个参数他不知道给啥。所以使用注解表示这个是取后面的参数的,这个后面的参数指客户端请求服务器时的url上的uri后面的参数,也就是之前的@ServerEndpoint后面的name从这个分割出来。后面是session是创建连接时自己创建的会话对象,会给我们塞入进来。
当客户与服务器建立连接时,将走入到@OnOen小的方法,我们能获得session对象。保存在对象上。@onMessage当客户发送消息时,我们就收到消息,那么就触发执行这个方法,一个是message内容,一个是session,内容就是客户端发送时send里面的内容获得。
session.getAsyncRemote从session会话中,取得这端。什么意思呢?从session对象获得到连接,获得到对象的那一端连接,就像socket一样获得连接,获得到流sendText发送信息。我们这里就是,客户与服务器建立连接,然后又取得客户端的流,等于是客户自己给自己发送,不过这个过程经过websocket中转了一下。毕竟是个测试,通了就OK
@onClose当连接关闭时触发,一般是客户端断开连接。@OnError发送异常时触发。
刚加载页面时,则就解析到script,支持websocket,根据URL连接服务器,后面的name在之前就定死了。ws://ip:port/websocketserver/zhangsan。已经张name写死了。消息也是,发送的是xxhh,而不是定义内容,这样简单一点。所以发送的消息是xixihaha
服务器知道客户端来连接,双方建立连接,onOpen建立连接触发,onMessage收到消息触发。期间都有session会话对象。获得到客户端端也就是流,然后将消息又发了回去,客户端收到了自己给服务器发的消息xixihaha
websocket就完成了,其注解都是在javax包下。为什么写上注解就能执行到我注解下的方法?获得到类,class构造类获得类的所有方法又获得所有注解。判断方法上的注解,如果有匹配的注解,则调用这个方法。这就等于是,反射类获得类的构造去调用,或是其他做法,仅是自己一时的想法。websocket就使用完毕