当前位置:   article > 正文

[前端基础]websocket协议_前端websocket

前端websocket

(1)websocket

websocket(简写为ws),是一种轻量化的协议,经过最开始的握手阶段以后,前后端之间允许自由地发送信息不受限制(建议发送json字符串).虽然理论上这个东西是属于协议内容,但是已经被疯狂封装得像框架一样了.

websocket协议具有天然的优势处理前端多线程并发,并且只需要一个后端就能完成服务.在各大视频网站上经常能见到使用ws技术构建的简单聊天室项目.难能可贵的是,java,javascript都引入了相关的内容.

本文主要介绍使用,对标面向对象的实验,需要详细看待原理建议去看文档内容

另外,websocket最重要的是四种状态和他们的监听函数,open,close,message,error

分别代表:某个用户开启服务,某个用户关闭服务,某一端接收信息,某一端发生错误

(2)前端部署和发送信息

1.在前端部署websocket内容

 websocket ws = new WebSocket("ws://127.0.0.1:8080/imserver/" + MyUsername);

很简单,直接创建websocket即可连接到后端(后端这个网址怎么来的我们后续再讨论,这个myUsername是我自己加上的内容,相当于传入一个参数,可以先不用管)

2.前端发送信息

  1. let oj={
  2. signal:8,
  3. to:self.counterpart
  4. }
  5. self.ws.send(JSON.stringify(oj));

我这里举了个例子,建立了一个对象,然后转化为json字符串,直接找到对应的ws对象,然后使用send即可

3.前端接收信息

前端接收信息和厚度按一样,建立事件监听器,然后创建回调函数

  1. this.ws.onopen = function () {
  2. }
  3. this.ws.onclose=function(){
  4. }
  5. this.ws.onmessage = function (event) {
  6. //event是个接收到的1信息
  7. }

(3)后端部署websocket

后端部署websocket有点麻烦....这里主要讲解springboot框架下的部署

首先在pom文件中部署如下几个依赖

  1. <!--websocket启动器-->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-websocket</artifactId>
  5. </dependency>
  6. <!--web启动器-->
  7. <dependency>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-starter-web</artifactId>
  10. </dependency>
  11. <!--热部署内容(不知道是干啥的)-->
  12. <dependency>
  13. <groupId>org.springframework.boot</groupId>
  14. <artifactId>spring-boot-devtools</artifactId>
  15. <scope>runtime</scope>
  16. <optional>true</optional>
  17. </dependency>

然后创建如下几个文件

 webConfig,这个是打开后端的拦截器,防止出现不能访问的情况

  1. package com.example.demochat.common.Config;
  2. import com.example.demochat.component.AuthInterceptor;
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
  5. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
  6. @Configuration
  7. public class WebConfig implements WebMvcConfigurer {
  8. @Override
  9. public void addInterceptors(InterceptorRegistry registry) {
  10. registry.addInterceptor(new AuthInterceptor()).addPathPatterns("/**").excludePathPatterns("/imserver/**");
  11. }
  12. }

websocketConfig,ws有关的部署

  1. package com.example.demochat.common.Config;
  2. import org.springframework.context.annotation.Bean;
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.web.socket.server.standard.ServerEndpointExporter;
  5. @Configuration
  6. public class WebSocketConfig {
  7. @Bean
  8. public ServerEndpointExporter serverEndpointExporter(){
  9. return new ServerEndpointExporter();
  10. }
  11. }

链接的时候用到的一个继承类

  1. package com.example.demochat.component;
  2. import jakarta.servlet.http.HttpServletRequest;
  3. import jakarta.servlet.http.HttpServletResponse;
  4. import org.springframework.stereotype.Component;
  5. import org.springframework.web.servlet.HandlerInterceptor;
  6. import org.springframework.web.servlet.ModelAndView;
  7. @Component
  8. public class AuthInterceptor implements HandlerInterceptor {
  9. @Override
  10. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  11. // 在此处实现身份验证逻辑
  12. return true; // true 表示继续执行后续的拦截器或处理器方法,false 则会中断请求处理
  13. }
  14. @Override
  15. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
  16. ModelAndView modelAndView) throws Exception {
  17. // 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
  18. }
  19. @Override
  20. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
  21. throws Exception {
  22. // 在整个请求结束之后被调用,也就是在DispatcherServlet渲染了对应的视图之后执行(主要是用于资源清理工作)
  23. }
  24. }

最后是核心文件,

这个东西里面就是我们websocket的基本逻辑

首先是建立一个链接,要借用注解来声明这里是都服务器的终端

里面会用到那些监听方法,有一个好消息是,我们不需要继承websocket这个类或者说这个接口,然后重写里面的方法.现在可以通过注释来给几个监听函数添加具体的回调

  1. //建立一个双通道的webSocket类
  2. @ServerEndpoint("/imserver/{username}")
  3. //这是一个声明,声明这里是服务器的终端,可以通过这个路径访问
  4. //{}代表占位符,可以通过@PathParam注解获取这个参数
  5. @Component
  6. public class WebSocketServer {
  7. //下面是四个基础方法,当触发对应事件的时候,注解就会调用这些方法
  8. @OnOpen
  9. public void onOpen(Session session, @PathParam("username") String username) throws IOException {
  10. }
  11. //移除某个用户
  12. @OnClose
  13. public void onClose(Session session, @PathParam("username") String username) throws IOException {
  14. }
  15. @OnMessage
  16. public void onMessage(String message,Session session,@PathParam("username") String username) throws IOException {
  17. }
  18. @OnError
  19. public void onError(Session session , Throwable err){//这里的参数类型必须是可抛出"Throwable"
  20. }
  21. }

对应的注解,标志着这个函数会在什么事件发生的时候调用

另外注意其中的参数,Session对象代表的是当前触发事件的具体对象,也就是前端窗口/用户,当用户触发对应事件的时候,就会填入对应参数中message参数代表的是传递进来的信息

Throwable是需要抛出的从错误

这些参数是必须的

2.后端发送请求:

  1. session.getBasicRemote().sendText(message);
  2. 直接让对应的窗口对象接收即可

利用session对象的对应方法发送消息即可

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/525736
推荐阅读
相关标签
  

闽ICP备14008679号