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

栏目: Java · 发布时间: 5年前

内容简介:先上图基于spring-boot项目开发的

先上图

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

基于spring-boot项目开发的

首先创建项目,不多说

依赖如下, springboot版本是 2.1.5

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-websocket</artifactId>
  <exclusions>
    <exclusion>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-tomcat</artifactId>
    </exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

配置

添加配置类 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<MyWebSocket> 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字符串和对象互转

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>fastjson</artifactId>
  <version>1.2.57</version>
</dependency>

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<Message> {
  @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<Message> {
  @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包下的)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

从0开始做运营 入门篇

从0开始做运营 入门篇

张亮 / 4.99元

此书是《从零开始做运营》系列的入门篇。 在互联网产品经理热的今天,关于传统的网站与产品运营的书籍一直非常缺乏,很多有志于互联网行业的年轻人并不明白一款产品、一个网站的策划、上线、成长、成熟直到衰落的过程中,除了产品和网站本身的设计之外,还有一块非常重要的工作是针对网站与产品生命周期的持续运营。 网站与产品运营是一个非常辛苦而非常有趣的事情,希望本书可以为有志于从事互联网网站与产品运营的......一起来看看 《从0开始做运营 入门篇》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具