Java WebSocket详解
写在前面,在项目中需要使用到websocket和前端进行交互时在网上寻找资源,但看了各种博客,一言难尽。最后看Oracle的JavaEE文档将WebSocket算是有了一个比较清晰的理解。
本文只对核心概念和核心使用方式进行说明(只说明注解方式,官方推荐),详细信息情参考官方文档,连接如下。
文档:https://docs.oracle.com/javaee/7/tutorial/websocket.htm
文章目录
一、WebSocket简介
WebSocket协议通过在客户端和服务端之间提供全双工通信来进行Web和服务器的交互功能。
在WebSocket应用程序中,服务器发布WebSocket端点,客户端使用url连接到服务器。建立连接后,服务器和客户端就可以互相发送消息。客户端通常连接到一台服务器,服务器接受多个客户端的连接。
1.1 WebSocket协议
WebSocket协议有两个部分:握手和传输。客户端通过向服务端URL发送握手请求来建立连接。握手与现有的基于HTTP的基础结构相兼容。Web服务器将其解释为升级版的HTTP连接请求。
一个客户端建立连接的握手请求:
GET /path/to/websocket/endpoint HTTP/1.1
Host: localhost
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg==
Origin: http://localhost
Sec-WebSocket-Version: 13
一个服务端响应:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: K7DJLdLooIwIG/MOpvWFB3y3FE8=
从上面的请求和响应中可以看出来,一个WebSocket连接的建立,需要客户端和服务端维护一个Key来作为该连接的连接凭证。
客户端向服务端发送WebSocketKey,服务器根据WebSocketKey生成WebSocketAccept返回给客户端,客户端对WebSocketKey的值再进行相同的操作,如果与服务器返回的Accept的值相匹配,就表示握手成功。握手之后客户端与服务端就互相发送消息。

1.2 WebSocket支持的消息类型
WebSocket支持文本消息(UTF-8编码)和二进制消息。WebSocket的控制消息由Close、Ping、Pong组成。ping和pong也有可能包含应用程序信息。
webSocket端点具有如下的URI形式表示:
ws://host:port/path?query
wss://host:port/path?query
ws代表未加密的连接,默认端口是80
wss代表加密的连接,默认端口是443
path:表示服务器内端点的位置
query:路径参数信息
二、创建一个WebSocket程序
创建和部署WebSocket端点的过程如下:
1、创建一个端点类
2、实现端点的生命周期方法
3、将业务逻辑添加到端点
4、将端点部署到Web应用程序中
注意:与Servlet相反,WebSocket端点类会被实例化多次,容器针对与其部署的URI的每个连接都创建一个实例。每个实例都与一个连接相关联。因为在任何时间都只有一个线程执行端点实例的代码,所以有助于保持每个连接的用户状态简化开发。
2.1 生命周期方法
EndPoint类中定义了三个生命周期方法:onOpen、onClose、onError
使用注解方式创建服务类
@ServerEndpoint("/echo")
public class EchoEndpoint {
@OnMessage
public void onMessage(Session session, String msg) {
try {
session.getBasicRemote().sendText(msg);
} catch (IOException e) {
... }
}
}
2.2 业务逻辑方法
@ServerEndpoint("/receive")
public class ReceiveEndpoint {
@OnMessage
public

最低0.47元/天 解锁文章
724

被折叠的 条评论
为什么被折叠?



