【Java网络编程】Websocket学习 - hippowc/hippowc.github.io GitHub Wiki

原理

协议层

  • WebSocket协议是html5的一种通信协议
  • WebSocket为应用层协议,其定义在TCP/IP协议栈之上。WebSocket连接服务器的URI以"ws"或者"wss"开头。ws开头的默认TCP端口为80,wss开头的默认端口为443。
  • Websocket是基于HTTP协议的,或者说借用了HTTP的协议来完成一部分握手。握手后会将http协议升级为websocket协议
  • WS一般默认是80端口,而WSS默认是443端口,大多数网站用的就是80和433端口

springboot实战

引入websocket

springboot与websocket的结合已经比较完美了

引入maven依赖

''' org.springframework.boot spring-boot-starter-websocket '''

启动类的操作

  • 在启动类上添加注解@EnableWebSocket
  • 使用内置Tomcat需要添加BeanServerEndpointExporter
  • 如果同时使用了定时任务则需要添加BeanTaskScheduler

ServerEndpoint 相当于服务端

类添加上两个注解@Component和@ServerEndpoint("/accesslog/ws/{username}")路径可以自定义,username用于区别每个不同的用户

WebSocket四个事件,分别对应四个注解@OnOpen(建立连接)、@OnMessage(收到客户端消息)、@OnClose(连接关闭)、 @OnError(发生异常)WebSocket推送采用Session,username用于区分不同用户的Session。在建立连接的时候会将该用户的Session和username信息存入ConcurrentHashMap

关于消息发送

websocket session发送文本消息使用了RemoteEndpoint.Basic basic = session.getBasicRemote(); basic.sendText(message);同步发送的方式

用户鉴权

普通的http请求可以通过HttpSession获取cookie等方法,获取用户登录信息,但是websocket的session与HttpSession不同,不会cookie信息。那如何从websocket中获取HTTPSession呢。

websocket的第一次握手是基于http请求的,可以从这边着手。ServerEndpoint注解可以指定Configurator,可以自己实现Configurator其中的modifyHandshake方法,这个方法中的握手请求方法是http请求,这个请求中会携带cookie或者httpSession,获取后把session放到ServerEndpointConfig中的用户属性中去,就可以在Endpoint类中获取这这个config

@OnOpen
    public void onOpen(Session session,EndpointConfig config) {
        HttpSession httpSession= (HttpSession) config.getUserProperties().get(HttpSession.class.getName());
        System.out.println( httpSession.getAttribute("name"));
        sessionMap.put(session.getId(), session);
    }

浏览器角度

WebSocket 是 HTML5 提供的一种在单个 TCP 连接上进行全双工通讯(信息能够同时双向传送)的协议。它使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

WebSocket 对象的相关事件 描述 Socket.onopen 连接建立时触发 Socket.onmessage 客户端接收服务端数据时触发 Socket.onerror 通信发生错误时触发 Socket.onclose 连接关闭时触发

WebSocket 对象的相关方法 描述 Socket.send() 使用连接发送数据 Socket.close() 关闭连接

⚠️ **GitHub.com Fallback** ⚠️