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类不是单例
image.png

  • 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
image.png
由上图可以看出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) { }




这个家伙很懒,啥也没有留下😋