一:WebSocket是什么?
他是一个客户端可以随时随地和服务端进行通信的一个技术。
二:如何学习WebSocket
包括两个,前端和后端的。前端主要是HTML5技术。后端我将用JAVA来实现。
首先看一下前端发送的请求报文,截取一部分如下
(暂且抄袭网上报文,测试成功后改为自己测试的报文)
GET /webfin/websocket/ HTTP/1.1
Host: localhost
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg==
Origin: http://localhost:8080
Sec-WebSocket-Version: 13
跟Http协议看起来很相似嘛。不过,还是有几个没见过。
Upgrade: websocket
叫服务端给老子升级为WebSocket协议
Sec-WebSocket-Key: 密文
这是客户端发给服务端一个 base64 编码的密文。服务端接受后也要返回一个密文给客户段,否则客户端会闹情绪
接下来看一下服务端返回给客户端的报文
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: 密文
Sec-WebSocket-Accept的值当然就是服务端返回给客户端的密文了
HTTP/1.1 101 Switching Protocols 表示服务端接受了升级为WebSocket的请求。
其他的报文内容就不解析了,我们又不是搞协议的,知道大概的流程就OK了。
服务端程序编写-加依赖
首先创建一个项目,可以是Maven的web项目,或者是普通的web项目。但是建议创建一个Maven的web项目,加jar包很简单。
为什么我要这么说,因为接下来我们要加一个jar包,用于支持我们的webSocket。
poi.xml只要加上这个依赖就行了
<dependency>
<!-- webSocket的JAVA包 -->
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.1</version>
</dependency>
当然技术日新月异,各位还是去仓库找找看有没有更新的依赖包吧。
那个,没建Maven项目的童鞋们,去老老实实下载jar加到classpath下面吧。
后端代码流程
1:
首先建一个webSocket类,在类上加一个注解
@ServerEndpoint(“/echo”)
表示注解的这个类是一个WebSocket类,并且访问这个webSocket的路径是/echo
注意:这个类必须要有个无参的默认构造函数
这种实现的webSocket的方式遵循标准 JSR356 规范实现
也有一种实现是Tomcat高版本自定义的api。
这里不解释另一种了
2:
利用注解,写webSocket的方法
@OnOpen注解的方法是当有新的连接连接到服务器时调用的方法
可以添加的参数:Session session
连接的会话信息,可以用该对象通过服务端传送信息给客户端。
@OnMessage注解的方法用于接受传入的客户端信息
可以添加的参数:String message,Session session
第一个参数是客户端传送来的信息,第二个参数见上
@OnClose注解的方法用于当webSocket连接关闭时
可以添加的参数:Session session, CloseReason reason
第二个参数是关闭的原因,通过reason.getReasonPhrase()可以获取连接关闭的原因,如果没有原因的话返回null
@onError注解的方法用于当webSocket连接发生错误时
可以添加的参数:Throwable t
第一个参数是异常对象,怎么用就不用我说了吧
PS:Session对象的几个常用方法
getBasicRemote().sendText();可以向这个会话所属的客户端发生消息
getId()获取这个会话的唯一标识符
其他的自己摸索
前端页面编写
首先new WebSocket(url)对象
url里面写ws://服务端ip地址:端口/web项目名/webSocket的注解名
(@ServerEndpoint(“/echo”)的echo就是注解名)
然后写一些触发事件
//当Websocket连接时触发该函数
ws.onopen = function (){
}
//当发送信息时调用
ws.onmessage = function(evt){
console.log(evt.data);
};
//当webSocket连接断开时调用
ws.onclose = function(evt){
};
//当发送异常时调用
ws.onerror = function(evt){
};
注:
需求:实现实时的web聊天系统,当有用户上线时,另外一个用户可以知道他上线了。暂且就这样