在线聊天室如何搭建,websocket的理解运用
这个配置类是用来获取WebSocket连接的握手请求中的HTTP会话对象,并将其保存起来,以便在后续的处理过程中使用。
在WebSocket连接握手时,客户端会发送一个HTTP请求,服务器需要对这个请求进行处理并升级为WebSocket连接。GetHttpSessionConfig
类继承了ServerEndpointConfig.Configurator
,它重写了modifyHandshake()
方法。
modifyHandshake()
方法在握手过程中被调用,它接收三个参数:ServerEndpointConfig
表示WebSocket端点的配置信息,HandshakeRequest
表示握手请求对象,HandshakeResponse
表示握手响应对象。
在GetHttpSessionConfig
的modifyHandshake()
方法中,首先通过request.getHttpSession()
方法获取到HTTP会话对象(HttpSession
),然后将其保存到sec.getUserProperties()
中,使用HttpSession.class.getName()
作为键。这样,在后续的处理过程中,就可以通过config.getUserProperties().get(HttpSession.class.getName())
来获取到该会话对象。
通过获取到HTTP会话对象,可以实现WebSocket和HTTP会话的关联,使得在WebSocket连接中可以访问和共享与该会话相关的数据和状态。
然后这个配置类的话,springboot就会自动扫描bean,并配置好使用websocket应有的一切
这边是工具类,里面有一个方法是getMessage,用来接收消息的,然后里面有一个类叫做ResultMessage,用来表示处理完的消息,为方便理解getMessage,我展示一下这个类的长相如下图
这个ResultMessage它有三个属性,是否为系统消息,谁发送的,还有消息本身,它是在pojo类里头,怎么说,因为以我目前的理解,它应该是不用跟数据库产生关系而交互,它更像是一个中间商?作为一个运行功能的媒介,所以在pojo类里,然后言归正传,继续康康getMessage()方法,他就是把属性暂存到ResultMessage中,存进去了就成为了一个整体,之后整个拿出来用就方便
这两个类也放在一起讲上面那张图是一个控制类,第一个接口,登录接口,传入两个参数(@RequestBody User user, HttpSession session),第一个User是前端发给你的,第二给session是自动生成的,用来储存用户信息,每个用户都有自己专属的session,然后他登录是用了个Result类懂得都懂Result干嘛的,就是用来按照特定的格式,返回一些结果的,这个接口,就是用户登录上去之后,给你在flag里面存储是否登录,然后把用户信息存储在session中,比如上面他就在session的session.setAttribute("user",user.getUsername());使用这个方法,建立了一个叫做"user"的字段,然后把用户名装进去,再看第二个接口,就是为了测试有没有成功装进去,调用了session.getAttribute("user")取出里面存储的用户名
然后又建立了一个Message类,来存储消息是谁发的,以及消息内容
现在就是这个ChatEndPoint类,可以把它跟spring boot的controller做类比学习,比如说上面有注解表明了url,然后封装了一个Map用于储存在线的用户,以及自身的HTTPSession,登陆时自动生成的,接下来讲三大重点,,第一个是onOpen,其实不太需要管它的参数,这个session就是握手是自动放进去的吧,然后那个config也不是咱们能放进去的,第一步就是从config里面拿到某某user的httpsession,然后封装起来,接着再从HTTP session中拿到user实体类,然后把user给放到OnlineUser里面,然后通知其他用户
接着就是两个方法,逻辑都是建立一个Set,然后把在线用户都放进去,接着进行逻辑操作
接下来是重点中的重点,OnMessage,它会得到Message,然后解析出messa的对象名和内容,接着通过对象名从在线用户表拿到对应的session,接着就是调用工具类的getMessage把它封装好(包括发给谁,发什么),然后调用session方法,直接发消息
然后接下来就是Onclose,先通过自己的HTTP session拿到实体类,接着把这个实体类user从在线用户中去掉,最后把它下线的消息告诉其他用户