热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

springboot项目中使用websocket(javax.websocket包下的)

先上图基于spring-boot项目开发的

先上图

springboot项目中使用websocket(javax.websocket包下的)

基于spring-boot项目开发的

首先创建项目,不多说

依赖如下, springboot版本是 2.1.5


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


  org.springframework.boot
  spring-boot-starter-undertow

配置

添加配置类 WebSocketConfig 代码如下

@Configuration
@EnableWebSocket
public class WebSocketConfig {

    @Bean
    public ServerEndpointExporter serverEndpoint() {
        return new ServerEndpointExporter();
    }
}

添加处理连接和处理消息类 MyWebSocket

@ServerEndpoint(value = "/websocket")
@Component
public class MyWebSocket {
    //在线人数
    private static int Online= 0;
    //所有的对象,用于群发
    public static List webSockets = new CopyOnWriteArrayList<>();
    //会话
    private Session session;

    public Session getSession() {
        return session;
    }

    //建立连接
    @OnOpen
    public void onOpen(Session session) {
        online++;
        webSockets.add(this);
        this.session = session;
    }

    //连接关闭
    @OnClose
    public void onClose() {
        online--;
        webSockets.remove(this);
    }

    //收到客户端的消息
    @OnMessage
    public String onMessage(String text, Session session) {
        return "client message: " + text;
    }
}

原接文链: https://tomoya92.github.io/2019/05/27/spring-boot-websocket/

客户端

if (window.WebSocket) {

  // Create WebSocket connection.
  const socket = new WebSocket('ws://localhost:8080/websocket');

  // Connection opened
  socket.addEventListener('open', function (event) {
    socket.send('Hello Server!');
  });

  // Connection closed
  socket.addEventListener('close', function (event) {
    socket.send('I am leave!');
  });

  // Listen for messages
  socket.addEventListener('message', function (event) {
    console.log(event);
  });

  // 延时给服务端发送一条消息
  setTimeout(function() {
    socket.send('hello world!');
  }, 500);

}

将上面js放在一个js里,启动项目,然后可以看到浏览器控制台里有日志输出

封装

上面已经是一个简单的websocket应用了,如果不嫌麻烦完全可以在客户端将对象转成json字符串发给后台,后台再将接收到的json字符串转成对象来处理,只要前端跟后台能约定好,就没有啥大问题

但是用了 java 怎么能少了封装,再说javax.websocket包里也支持 encoder , decoder , 下面来说一下怎么直接接收一个对象

先创建一个用于传输数据的对象

public class Message implements Serializable {

  private static final long serialVersiOnUID= 7600555288728686383L;

  private String type;
  private Object payload;

  public Message() {
  }

  public Message(String type, Object payload) {
    this.type = type;
    this.payload = payload;
  }

  public String getType() {
    return type;
  }

  public void setType(String type) {
    this.type = type;
  }

  public Object getPayload() {
    return payload;
  }

  public void setPayload(Object payload) {
    this.payload = payload;
  }
}

创建 encoder 和 decoder,我这里用的是fastjson包将json字符串和对象互转


  com.alibaba
  fastjson
  1.2.57

MessageEncoder.java

import co.yiiu.pydeploy.util.Message;
import com.alibaba.fastjson.JSON;

import javax.websocket.Encoder;
import javax.websocket.EndpointConfig;

public class MessageEncoder implements Encoder.Text {
  @Override
  public String encode(Message o) {
    return JSON.toJSONString(o);
  }

  @Override
  public void init(EndpointConfig endpointConfig) {

  }

  @Override
  public void destroy() {

  }
}

文原接链: https://tomoya92.github.io/2019/05/27/spring-boot-websocket/

MessageDecoder.java

import co.yiiu.pydeploy.util.Message;
import com.alibaba.fastjson.JSON;

import javax.websocket.Decoder;
import javax.websocket.EndpointConfig;

public class MessageDecoder implements Decoder.Text {
  @Override
  public Message decode(String s) {
    return JSON.parseObject(s, Message.class);
  }

  @Override
  public boolean willDecode(String s) {
    // 验证json字符串是否合法,合法才会进入decode()方法进行转换,不合法直接抛异常
    return JSON.isValid(s);
  }

  @Override
  public void init(EndpointConfig endpointConfig) {

  }

  @Override
  public void destroy() {

  }
}

修改 MyWebSocket.java 类注解,添加上 @ServerEndpoint(value = "/websocket", encoders = {MessageEncoder.class}, decoders = {MessageDecoder.class})

其中 @OnMessage 注解修饰的方法参数就可以用 Message 对象来接收了

//收到客户端的消息
@OnMessage
public Message onMessage(Message text, Session session) {
  System.out.println("client message: " + text.toString());
  // 直接将前端发的对象返回给前端显示
  return text;
}

前端接收到的数据还是字符串,还是要通过 JSON.parse(str) 来转换一下

点对点和群发

点对点发消息要知道对方websocket的session,然后通过 session.getBasicRemote().sendText("text") 方法发送给对方

群发只需要把 MyWebSocket 类中的 webSockets 对象循环再使用点对点的方式发送即可

总结

写 encoder 和 decoder 的时候发现还有 binery 的解码跟编码,也就是说还可以能过自定义编/解码用来传输二进制的数据,这块我没有折腾,有需要了再弄

原文链接:


以上所述就是小编给大家介绍的《springboot项目中使用websocket(javax.websocket包下的)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 我们 的支持!


推荐阅读
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 标题: ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • 开发笔记:spring boot项目打成war包部署到服务器的步骤与注意事项
    本文介绍了将spring boot项目打成war包并部署到服务器的步骤与注意事项。通过本文的学习,读者可以了解到如何将spring boot项目打包成war包,并成功地部署到服务器上。 ... [详细]
  • 微信官方授权及获取OpenId的方法,服务器通过SpringBoot实现
    主要步骤:前端获取到code(wx.login),传入服务器服务器通过参数AppID和AppSecret访问官方接口,获取到OpenId ... [详细]
  • AFNetwork框架(零)使用NSURLSession进行网络请求
    本文介绍了AFNetwork框架中使用NSURLSession进行网络请求的方法,包括NSURLSession的配置、请求的创建和执行等步骤。同时还介绍了NSURLSessionDelegate和NSURLSessionConfiguration的相关内容。通过本文可以了解到AFNetwork框架中使用NSURLSession进行网络请求的基本流程和注意事项。 ... [详细]
  • 1.Listener是Servlet的监听器,它可以监听客户端的请求、服务端的操作等。通过监听器,可以自动激发一些操作,比如监听在线的用户的数量。当增加一个HttpSession时 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
author-avatar
benbowujixian
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有