您的位置:首页 > 其它

WebSocket-发送对象-自定义Encoder

2020-06-28 05:08 573 查看

因最近要交前端结课作业,需要连数据库并一起打包太麻烦!

用Vue写前后端分离又稍显复杂,所以准备在我自己的服务器上放一个 WebSocket

再通过 前端 来建立连接获取 数据 就行了

概述:

  • Websocket发送对象,通过Encoder 自定义规则(转换为JSON字符串),前端收到后再转换为JSON对象

  • 如果不实现并指定Encoder,直接通过 session.getBasicRemote().sendObject(Object object); 发送对象报异常

    javax.websocket.EncodeException: No encoder specified for object of class xxxx

场景:

  • 可以单独写一个WebSocket来提供服务,统一返回JSON格式;

    websocket不存在跨域问题,通过请求参数来权限验证\控制;

依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.68</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.10.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.3</version>
</dependency>

自定义Encoder

package com.live.config;

import com.alibaba.fastjson.JSON;
import com.live.model.User;

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

public class WebSocketCustomEncoding implements Encoder.Text<User> {
@Override
public String encode(User user) {
assert user!=null;
return JSON.toJSONString(user);
}

@Override
public void init(EndpointConfig endpointConfig) {

}

@Override
public void destroy() {

}
}

Websocket发送自定义对象

如果不在 @ServerEndpoint 指定endocers,直接通过sendObject(Object o)发送对象,

会报javax.websocket.EncodeException: No encoder specified for object of class xxxx异常

@Service
//encoders指定自定义的Encoder类文件
@ServerEndpoint(value = "/websocketService",encoders = WebSocketCustomEncoding.class)
public class WebSocketService {

@OnOpen
public void open(Session session) throws IOException, EncodeException {
System.out.println("连接打开了");

User user = new User();
user.setId(1);
user.setPassword("081420");
user.setName("DeadAndLive");
//发送自定义对象
session.getBasicRemote().sendObject(user);
}

}

前端

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
</body>
<script src="js/jquery-3.4.1.min.js"></script>
<script>
let websocket = new WebSocket("ws://localhost:8080/websocketService");
$(document).ready(function() {
// 指定websocket路径
websocket.onopen = function(event) {
console.log("连接打开");
// websocket.send("this is client send message!")
websocket.onmessage = function(e) {
//收到的字符串消息
console.log(e.data);
//将字符串转为JSON对象
var json = JSON.parse(e.data);
console.log(json);
}
};
});
window.onbeforeunload = function(){
if (websocket!=null) {
websocket.close();
}
}
</script>
</html>

打印结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: