WebSocket 是一种应用程序协议,它通过 TCP 协议在两个对等体之间提供全双工通信。
- 半双工通信
发送数据的同时也能够接收数据,两者同步进行。但不能双方同时发送或同时接收 例如对讲机 - 全双工通信
发送数据的同时也能够接收数据,两者同步进行。 例如手机
在HTTP中使用的传统请求-响应模型中,客户端请求资源,服务器提供响应,具有局限性
WebSocket简介
- 服务器发布一个 WebSocket端点,客户端使用端点的 URI 连接到服务器。
- WebSocket协议在建立连接后是对称的;客户端和服务器可以在连接打开时随时相互发送消息,并且可以随时关闭连接。
- 客户端通常只连接到一台服务器,服务器接受来自多个客户端的连接。
WebSocket协议
- WebSocket协议有两部分:握手和数据传输。客户端通过使用其 URI 向 WebSocket 终结点发送请求来启动握手。
- 握手与现有的基于 HTTP 的基础结构兼容:Web 服务器将其解释为 HTTP 连接升级请求。
- WebSocket支持传输类型
文本消息(编码为 UTF-8)和二进制消息 - WebSocketURI
ws://host:port/path?query
未加密的连接,默认为80端口
wss://host:port/path?query
加密连接,默认为443端口
创建WebSocket
WebSocket 端点被实例化了多次。换句话说websocket对服务器的压力更大
容器会根据与其部署 URI 的连接创建终结点的实例。每个实例都与一个且只有一个连接相关联。换句话说websockt类不是单例
- javax.websocket.server包
websocket服务端类、接口、注解 - javax.websocket包
websocket客户端及及通用类、接口、注解
创建和部署 WebSocket endpoint的过程如下。
1.创建endpoint类。
2.实现endpoint的生命周期方法。
3.将业务逻辑添加到endpoint。
4.在 Web 应用程序内部署endpoint。
@ServerEndpoint("/echo")
public class WebSocketTest {
public WebSocketTest(){
System.out.println("WebSocketTest被实例化");
}
@OnMessage
public void onMessage(Session session, String msg) {
try {
session.getBasicRemote().sendText(msg);
System.out.println(msg);
} catch (IOException e) {
e.printStackTrace();
}
}
}
在线测试地址
http://coolaf.com/tool/chattest
由上图可以看出WebSocket是多例的,可重复创建实例,但是servlet默认单例(可以特别声明创建多例)
注解声明周期含义
- @OnOpen 连接已打开
public void open(Session session,
EndpointConfig conf) { }
- OnMessage 收到的消息
public void message(Session session,
String msg) { }
- @OnError 连接错误
public void error(Session session,
Throwable error) { }
- OnClose 连接已关闭
@OnClose
public void close(Session session,
CloseReason reason) { }
Comments | 0 条评论